我正在尝试调用一个使用结构体作为参数的C库函数。我该怎么做?我已经创建了类似于文档中所做的结构的Ctypes表示,但是直接传递它不起作用。我尝试找到例子,但是我找到的所有例子都是传递结构体指针。
我有完全相同的问题。我有一个名为libxxxx.so的C文件和相应的.h文件。这就是全部了。在第一个.h文件中定义的几个函数原型需要在堆栈上传递结构体。该结构在第二个.h文件中定义。我查看了usb1 Python库包装器,每个结构都作为指向函数原型的指针传递。(有些甚至是指向指针的指针。)
我为此结构制作了一个包装器:
typedef struct _SE_ADDR{
int slot; /**< The index of the target slot. */
int fpga; /**< The index of the target FPGA. */
int reg; /**< The index of the target register. */
} SE_ADDR;
class SE_ADDR(Structure):
_fields_ = [('slot', c_int),
('fpga', c_int),
('reg', c_int)]
SE_ADDR_p = POINTER(SE_ADDR) #Pointer to SE_ADDR required for se_waitForData_new
addr = wrapper.SE_ADDR(0,0,0)
看起来这个有效。
没有看到您的代码,很难给出准确的答案,但我的猜测是您需要实例化这个数据结构。根据文档:
from ctypes import *
class POINT(Structure):
_fields_ = [("x", c_int),
("y", c_int)]
point = POINT(10, 20)
最后一行创建了一个名为point的POINT结构实例。
如果您能显示结构定义,展示如何使用它以及任何错误信息,将会非常有帮助。
foo(struct mystruct bar)
)而不是指针。我不知道ctypes
是否支持这种情况。您可以尝试通过传递一堆参数来模拟它,但这非常脆弱并且依赖于调用约定。最好编写一个 Cython 包装器或类似的东西。 - nneonneo