2010-06-28 17 views
8

Provo a passare un puntatore di una struttura che mi viene dato come valore di ritorno dalla funzione 'bar' alla funzione 'foo_write'. Ma ottengo il messaggio di errore 'TypeError: deve essere un tipo ctypes' per la riga 'foo = POINTER (temp_foo)'. Nel ctypes online help ho scoperto che 'ctypes.POINTER' funziona solo con tipi di ctypes. Conosci un altro modo? Cosa raccomanderesti?Come restituire un puntatore a una struttura in 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

Intendevi bar() per restituire 'FOO *' piuttosto che 'foo *'? – Clifford

+0

Hai omesso 'da ctypes import *'? – Clifford

risposta

5

La funzione bar ha una definizione non corretta, credo che dire che è struct FOO_ *bar(int);?

Il codice Python è errato nel senso che foo_parameter non viene mai dichiarato, quindi non sono sicuro al 100% di ciò che si desidera fare. Presumo che tu voglia passare un parametro del tuo python dichiarato foo, che è un'istanza di struct FOO_, nel C bar(int) e recuperare un puntatore a struct FOO_.

Non è necessario POINTER di farlo, il seguente funziona:

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

Dal ctypes sarà avvolgere il tipo di ritorno di bar() in una struttura puntatore-a-per voi.

+0

Ciao rq, ho scelto te come hai sottolineato, che non ho bisogno di ctypes.POINTER a tutti. – Framester

+3

Qui c'è un nome di classe o una variabile? In che modo c_types sa che il tipo di restituzione della barra è "pippo"? – fadedbee

+0

foo è sia un nome di classe che un nome di variabile? – Overdrivr

Problemi correlati