Ctype,python3.5,OSError:异常:访问冲突写入0x00000000
原学程将引见Ctype,python三.五,OSError:异常:拜访抵触写进0x00000000的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
在研讨其余相似毛病时,我以为我碰到了不法操纵的成绩,比方写进不该该写进的天址。我没有肯定该怎样处理这件事。有甚么须要协助的吗?
我支到切实其实切毛病:
in GetSoftwareVersion()
result = f(LCP_Version, FCP_Version)
OSError: exception: access violation writing 0x00000000
我正在挪用的函数
x = GetSoftWareVersion()
print(x)
GetSoftwareVersion()实质
def GetSoftwareVersion():
f = shim.GetSoftwareVersion
LCP_Version = ct.c_char_p(0)
FCP_Version = ct.c_char_p(0)
result = f(LCP_Version, FCP_Version)
if result:
print(find_shim_error(result))
return LCP_Version.contents.value, FCP_Version.contents.value
编纂:添减相干C++代码
PCSHIMDLL_API error_status_type GetSoftwareVersion(
char* LCP_Version,
char* FCP_Version
)
{
error_status_type return_status = SUCCESS;
string LCP_V("");
string FCP_V("");
LaserIDType_var laserID;
laserID = p_DiagIF->GetLaserID();
LCP_V = laserID->m_LCPSoftwareVersion;
FCP_V = laserID->m_FCPSoftwareVersion;
strcpy(LCP_Version, LCP_V.c_str());
strcpy(FCP_Version, FCP_V.c_str());
return return_status;
}
推举谜底
因为语句LCP_Version = ct.c_char_p(0)
,您支到毛病OSError: exception: access violation writing 0x00000000
。如ctypes documentation for c_char_p
所示,您正在传播1个整数天址。
您告知ctypes
要做的是创立1个指向0
的新char *
,而后测验考试经由过程strcpy(LCP_Version, LCP_V.c_str());
指向它。假如应用ct.c_char_p(一)
,则会获得access violation writing 0x000000一
,假如是c_char_p(二)
,则是0x...二
,依此类推。您的内存没有太能够许可您写进该地位,是以涌现毛病。
您能够愿望应用create_string_buffer(N)
,个中N
是包括LCP_V = laserID->m_LCPSoftwareVersion;
输入所需的数组年夜小。create_string_buffer
望文生义,它将为您供给1个初初化为空字节的可变字符慢冲区(比方p = create_string_buffer(三)
表现p
年夜小为三,实质b'x00x00x00
))。您不妨猜想并检讨或者检查p_DiagIF->GetLaserID();
的起源,以寻觅N
的平安值,或许只给本身1个伟大的(作为版原号)LCP_Version = ct.c_char_p(五0)
,而后从那边遴选1些开理的器械。
佳了闭于Ctype,python三.五,OSError:异常:拜访抵触写进0x00000000的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。