我尝试传递一个结构的指针,该结构从函数'bar'返回给函数'foo_write'作为返回值。但是我得到'foo = POINTER(temp_foo)'行的错误消息'TypeError:必须是ctypes类型'。在ctypes online help我发现'ctypes.POINTER'仅适用于ctypes类型。你知道另一种方式吗?你会推荐什么?
C:
typedef struct FOO_{
int i;
float *b1;
float (*w1)[];
}FOO;
foo *bar(int foo_parameter) {...
void foo_write(FOO *foo)
Python with ctypes:
class foo(Structure):
_fields_=[("i",c_int),
("b1",POINTER(c_int)),
("w1",POINTER(c_float))]
temp_foo=foo(0,None,None)
foo = POINTER(temp_foo)
foo=myclib.bar(foo_parameter)
myclib.foo_write(foo)
答案 0 :(得分:6)
更改
foo = POINTER(temp_foo)
到
foo = pointer(temp_foo)
可以解决问题。
有关详细信息,请参阅http://docs.python.org/library/ctypes.html#ctypes-pointers。
答案 1 :(得分:5)
您的bar
函数定义不正确,我猜您的意思是struct FOO_ *bar(int);
?
从永远不会声明foo_parameter
的意义上来说,Python代码是错误的,所以我不能100%确定你想要做什么。我假设您要将您的python声明的foo
的参数(struct FOO_
的实例)传递到C bar(int)
并返回指向struct FOO_
的指针
您不需要POINTER来执行此操作,以下操作:
#!/usr/bin/env python
from ctypes import *
class foo(Structure):
_fields_=[("i",c_int),
("b1",POINTER(c_int)),
("w1",POINTER(c_float))]
myclib = cdll.LoadLibrary("./libexample.so")
temp_foo = foo(1,None,None)
foovar = myclib.bar(temp_foo.i)
myclib.foo_write(foovar)
由于CTypes会将返回类型bar()
包装在指向结构的指针中。