Python & CTypes Null Pointer Error

Python & CTypes Null Pointer Error

本文关键字:Pointer Error Null CTypes Python      更新时间:2023-10-16

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

其中一个功能要求将结构传递到函数调用中,我不确定我是否会使用CTYPE正确地进行操作。

标题文件中结构的定义是:

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)]

i然后使用以下内容:

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

@ereryksun在评论中建议的,问题是类型。下面的工作代码以供将来参考:

结构应为:

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))

一些注释:数组大小参数是实际数组大小的一半。该功能将2个交织的浮子置于每个样品的阵列中(复杂的智商数据(。

将数组指针转换回python数组是使用numpy完成的:

np.fromiter(self.iqArr,dtype=np.float,count=48611)
相关文章: