Python& CTypes空指针错误

时间:2017-04-25 01:28:40

标签: python c++ struct ctypes

我正在从Python访问C ++共享库。 C ++共享库管理信号分析器,并在没有源的情况下进行分发。

其中一个函数需要将一个struct传递给函数调用,我不确定我是否正确使用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,转换为空指针错误。我构造结构并将其传递给函数调用的方式有什么问题吗?

1 个答案:

答案 0 :(得分:0)

正如@eryksun在评论中所建议的那样,问题属于类型。下面的工作代码供将来参考:

结构应该是:

import ctypes as ct

class IQPacketData (ct.Structure):
_fields_ = [('iqData',ct.POINTER(ct.c_float)),
            ('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))

一些注意事项:数组大小参数是实际数组大小的一半。该函数为每个样本(复杂的IQ数据)将2个交错浮点数放入数组中。

使用Numpy:

将数组指针转换回python数组
np.fromiter(self.iqArr,dtype=np.float,count=48611)