python 空指针_Python&CType空指针错误

我正在从Python访问C++共享库。 C++共享库管理信号分析器,并且在没有源代码的情况下分发。Python&CType空指针错误

其中一个功能需要一个结构被传递到函数调用,我不知道我正在使用ctypes正确地做它。

在头文件中的结构定义是:

typedef struct saIQPacket {

float *iqData;

int iqCount;

int purge;

int dataRemaining;

int sampleLoss;

int sec;

int milli;

} saIQPacket;

而且我最终调用的函数:

SA_API saStatus saGetIQData(int device, saIQPacket *pkt);

在Python中,我创建了一个类,如下所示:

class IQPacketData (ct.Structure):

_fields_ = [('iqData',ct.c_float*48611),

('iqCount',ct.c_int),

('purge', ct.c_int),

('dataRemaining', ct.c_int),

('sampleLoss', ct.c_int),

('sec', ct.c_int),

('milli', ct.c_int)]

然后我使用上面的如下:

self.iqPurge = ct.c_int(0)

self.iqDataRemaining = ct.c_int(0)

self.iqSampleLoss = ct.c_int(0)

self.secondsRemaining = ct.c_int(0)

self.millisecondsRemaining = ct.c_int(0)

self.iqarraySize = ct.c_int(24305)

self.iqArr = (ct.c_float*48611)()

self.saIQPacketData = IQPacketData(self.iqArr,

self.iqarraySize,

self.iqPurge,

self.iqDataRemaining,

self.iqSampleLoss,

self.secondsRemaining,

self.millisecondsRemaining)

初始化设备后,我调用该函数如下:

err = self.dll.saGetIQData(self.deviceHandle,ct.pointer(self.saIQPacketData))

当功能运行时,它返回值-1翻译作为一个空指针误差。我构造struct并将它传递给函数调用的方式有什么问题吗?

2017-04-25

wgebers

+0

'iqData'应该是一个'浮子*',而不是阵列。将其更改为'ct.POINTER(ct.c_float)'。您仍然可以将数组分配给该字段。 ctypes足够聪明,可以验证数组元素类型是否正确,并将地址存储在struct字段中,同时在struct __objects中保留对基础数组的引用。 –

+0

不需要手动将整数值包装为'c_int'实例。此外,调用可以使用'ct.byref(self.saIQPacketData)'而不是分配一个指针。 –

+0

谢谢@eryksun。更改iqData的类型并将指针传递给构造函数可解决问题。 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值