2010-06-28 10 views
8

"Bar" işlevinden "foo_write" işlevine dönüş değeri olarak verilen bir yapının işaretçisini göstermeye çalışıyorum. Ama hata mesajı 'TypeError:' 'caydırıcı tip olmalı' 'satırında' foo = POINTER (temp_foo) 'mesajı alıyorum. ctypes online help'da 'ctypes.POINTER' yalnızca klişe türleri ile çalıştığını fark ettim. Başka bir yol biliyor musun? Ne önerirsiniz?Klişe içindeki bir yapıya bir işaretçi nasıl geri dönülür?

C: ctypes ile

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) 
+0

Bunu mu demek istediniz: bar() 'foo *' yerine 'FOO *' döndürüyor mu? – Clifford

+0

'ctypes import' 'ifadesini atladınız mı? – Clifford

cevap

5

Sizin bar işlevi hatalı bir tanıma sahip, ben bunu struct FOO_ *bar(int); anlamına tahmin?

Python kodu, foo_parameter'un asla bildirilmemesi anlamında yanlıştır, bu yüzden ne yapmak istediğinize% 100 emin değilim. Bir struct FOO_ örneğidir, örneğindeki python bildirilen parametresinin bir parametresini C bar(int) içine iletmek ve struct FOO_ işaretçisini geri almak istediğinizi varsayalım.

Bunu yapmak için IŞARETÇIYI gerekmez, şu çalışacaktır: ctypes yana

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

sizin için bir işaretçi-to-yapı içinde bar() dönüş türünü kaydırılır.

+0

Merhaba rq, işaret ettiğim gibi seni seçtim, ctypes.POINTER'a hiç ihtiyacım yok. – Framester

+3

Burada bir sınıf adı mı yoksa değişken var mı? C_types, dönüş türünün 'foo' olduğunu biliyor mu? – fadedbee

+0

foo hem bir sınıf hem de bir değişken ismidir? – Overdrivr