Я пытаюсь передать указатель структуры, которой дают меня как возвращаемое значение от функциональной 'панели' до функции 'foo_write'. Но я получаю сообщение об ошибке 'TypeError: должен быть тип ctypes' для строки 'нечто = УКАЗАТЕЛЬ (temp_foo)'. В ctypes онлайн помогают, я нашел это 'ctypes. УКАЗАТЕЛЬ' только работает с типами ctypes. Вы знаете об иначе?Что Вы порекомендуете?
C:
typedef struct FOO_{
int i;
float *b1;
float (*w1)[];
}FOO;
foo *bar(int foo_parameter) {...
void foo_write(FOO *foo)
Python с 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)
Ваша функция bar
имеет неверное определение, я думаю, вы имеете в виду, что это struct FOO_ * bar (int);
?
Python код неверен в том смысле, что foo_parameter
никогда не объявляется, поэтому я не уверен на 100%, что вы хотите сделать. Я предполагаю, что вы хотите передать параметр объявленного в Python foo
, который является экземпляром структуры struct FOO_
, в панель C (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 ()
в указатель на структуру.
Замена
foo = POINTER(temp_foo)
на
foo = pointer(temp_foo)
может решить проблему.
Пожалуйста, смотрите http://docs.python.org/library/ctypes.html#ctypes-pointers для получения дополнительной информации.