Как возвратить указатель на структуру в ctypes?

Я пытаюсь передать указатель структуры, которой дают меня как возвращаемое значение от функциональной 'панели' до функции '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)

9
задан Framester 28 June 2010 в 00:17
поделиться

2 ответа

Ваша функция 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 () в указатель на структуру.

5
ответ дан 3 November 2019 в 00:58
поделиться

Замена

foo = POINTER(temp_foo)

на

foo = pointer(temp_foo)

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

Пожалуйста, смотрите http://docs.python.org/library/ctypes.html#ctypes-pointers для получения дополнительной информации.

6
ответ дан 3 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: