我试图在一个使用结构作为参数的C库中调用一个函数。我该怎么做呢?我已经创建了类似于文档中所做的结构的Ctypes表示,但我直接传递它不起作用。
我试图找到示例,但我发现的所有示例都是通过指向结构的指针。
答案 0 :(得分:3)
在没有看到你的代码的情况下很难分辨,但我的猜测是你必须实例化结构。来自文档:
from ctypes import *
class POINT(Structure):
_fields_ = [("x", c_int),
("y", c_int)]
point = POINT(10, 20)
最后一行创建了一个名为point的POINT结构实例。
如果您可以显示结构定义,如何使用它以及任何错误消息,那将非常有用
答案 1 :(得分:3)
我遇到了完全相同的问题。我有一个C libxxxx.so文件和相应的.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;
在Python包装器模块中,我创建了一个类来表示这个结构:
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
然后在导入包装后我按照上面描述的@picomancer的方式使用它:
addr = wrapper.SE_ADDR(0,0,0)
这似乎有效。