Как вернуть указатель на структуру в ctypes? - PullRequest
8 голосов
/ 28 июня 2010

Я пытаюсь передать указатель структуры, который мне дают как возвращаемое значение из функции 'bar' в функцию 'foo_write'.Но я получаю сообщение об ошибке «TypeError: должен быть тип ctypes» для строки «foo = POINTER (temp_foo)».В онлайн-справке ctypes я обнаружил, что 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 с типами:

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)

Ответы [ 2 ]

6 голосов
/ 28 июня 2010

Изменение

foo = POINTER(temp_foo)

до

foo = pointer(temp_foo)

может решить проблему.

Подробнее см. http://docs.python.org/library/ctypes.html#ctypes-pointers.

5 голосов
/ 28 июня 2010

Ваша bar функция имеет неверное определение, я думаю, вы имеете в виду, что это struct FOO_ *bar(int);?

Код Python неверен в том смысле, что foo_parameter никогда не объявляется, поэтому я не100% уверены, что вы хотите сделать.Я предполагаю, что вы хотите передать параметр вашего объявленного на Python foo, который является экземпляром struct FOO_, в C bar(int) и получить указатель на struct FOO_.

Youдля этого не нужен 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() в указатель на структуру.

...