2010-06-28 20 views
8

Intento pasar un puntero de una estructura que se me da como un valor de retorno de la función 'bar' a la función 'foo_write'. Pero aparece el mensaje de error 'TypeError: debe ser un tipo de tipo de letra' para la línea 'foo = POINTER (temp_foo)'. En el ctypes online help encontré que 'ctypes.POINTER' solo funciona con tipos de tipos. ¿Sabes de otra manera? ¿Qué recomendarías?¿Cómo devolver un puntero a una estructura en ctypes?

C:

typedef struct FOO_{ 
    int i; 
    float *b1; 
    float (*w1)[]; 
}FOO; 

foo *bar(int foo_parameter) {... 
void foo_write(FOO *foo) 

Python con 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

¿Quisiste decir bar() para devolver 'FOO *' en lugar de 'foo *'? – Clifford

+0

¿Ha omitido 'from ctypes import *'? – Clifford

Respuesta

5

Su función bar tiene una definición incorrecta, supongo que quiere decir que es struct FOO_ *bar(int);?

El código de Python es incorrecto en el sentido de que foo_parameter nunca se declara, por lo que no estoy 100% seguro de lo que quiere hacer. Supongo que quiere pasar un parámetro de su python-declarado foo, que es una instancia de struct FOO_, en el C bar(int) y obtener un puntero a struct FOO_.

No es necesario PUNTERO para hacer eso, el siguiente trabajo:

#!/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) 

Desde ctypes envolverá el tipo de retorno de bar() en una estructura de puntero-a-para usted.

+0

Hola rq, te elegí como dijiste, que no necesito ctypes.POINTER en absoluto. – Framester

+3

¿Es foo un nombre de clase, o una variable aquí? ¿Cómo sabe c_types que el tipo de devolución de la barra es 'foo'? – fadedbee

+0

foo es una clase y un nombre de variable? – Overdrivr

Cuestiones relacionadas