我正在从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,转换为空指针错误。我构造结构并将其传递给函数调用的方式有什么问题吗?
答案 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)