Python类型空指针E(&C)

2024-10-01 22:44:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从Python访问C++共享库。C++共享库管理信号分析器,并且没有源代码分发。在

其中一个函数需要将一个结构传递到函数调用中,我不确定是否使用ctypes正确地执行了该操作。在

头文件中结构的定义是:

typedef struct saIQPacket {
    float *iqData;
    int iqCount;
    int purge;
    int dataRemaining;
    int sampleLoss;
    int sec;
    int milli;
} saIQPacket;

最后我调用的函数是:

^{pr2}$

在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,这将转换为空指针错误。我构造结构并将其传递给函数调用的方式是否有问题?在


Tags: 函数selfsecfloat结构int函数调用ct
1条回答
网友
1楼 · 发布于 2024-10-01 22:44:00

正如@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)]

创建实例:

^{pr2}$

最后调用函数:

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

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

使用Numpy将数组指针转换回python数组:

np.fromiter(self.iqArr,dtype=np.float,count=48611)

相关问题 更多 >

    热门问题