3

我正在尝试调用使用结构作为参数的 C 库中的函数。我该怎么做呢?我已经创建了类似于文档中所做的结构的 Ctypes 表示,但我直接传递它不起作用。

我试图找到示例,但我找到的所有示例都传递了指向结构的指针。

4

2 回答 2

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

然后在导入包装器后,我以上述@picomacer 的方式使用它:

addr = wrapper.SE_ADDR(0,0,0)

这似乎有效。

于 2013-05-23T04:41:21.513 回答
3

没有看到你的代码很难说,但我猜你必须实例化结构。从文档:

from ctypes import *

class POINT(Structure):
    _fields_ = [("x", c_int),
                ("y", c_int)]

point = POINT(10, 20)

最后一行创建了一个名为 point 的 POINT 结构的实例。

如果您可以显示结构定义、如何使用它以及任何错误消息,这将非常有帮助

于 2013-03-26T21:53:10.183 回答