2010-06-28 12 views
8

मैं एक संरचना जो मुझे समारोह 'foo_write' के लिए समारोह 'बार' से वापसी के मूल्य के रूप में दिया जाता है की एक सूचक पारित करने के लिए प्रयास करें। लेकिन मैं त्रुटि संदेश 'लेखन त्रुटि: एक ctypes प्रकार होना चाहिए' प्राप्त लाइन 'foo = सूचक (temp_foo)' के लिए। ctypes online help में मैंने पाया कि 'ctypes.POINTER' केवल ctypes प्रकार के साथ काम करता है। क्या आप किसी अन्य तरीके से जानते हैं? आप क्या सुझाव देंगे?ctypes में एक संरचना के लिए एक सूचक वापस कैसे करें?

सी:

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

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

पायथन:

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

क्या आपका मतलब है कि 'foo * 'की बजाय' FOO * 'वापस करने के लिए बार()? – Clifford

+0

क्या आपने 'ctypes आयात * से छोड़ा है? – Clifford

उत्तर

5

आपका bar समारोह एक गलत परिभाषा है, मुझे लगता है तुम्हारा मतलब यह struct FOO_ *bar(int); है?

पायथन कोड इस अर्थ में गलत है कि foo_parameter कभी घोषित नहीं किया गया है, इसलिए मुझे 100% यकीन नहीं है कि आप क्या करना चाहते हैं। मैं तुम्हें सी bar(int) में अपने अजगर-घोषित foo है, जो एक struct FOO_ का एक उदाहरण है, की एक पैरामीटर गुजरती हैं और struct FOO_ के लिए सूचक वापस प्राप्त करना चाहते हैं मान।

आप ऐसा सूचक जरूरत नहीं है, निम्नलिखित काम करेगा:

#!/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 के बाद से आप के लिए एक सूचक करने वाली struct में bar() की वापसी प्रकार लपेटो जाएगा।

+0

हाय RQ, मैं तुम्हें चुना है, जैसा कि आप ने कहा, कि मैं बिल्कुल भी ctypes.POINTER जरूरत नहीं है। – Framester

+3

क्या एक क्लासनाम है, या यहाँ एक चर है? C_types कैसे जानते हैं कि बार का रिटर्न प्रकार 'foo' है? – fadedbee

+0

foo दोनों एक वर्ग और एक चर नाम है? – Overdrivr

संबंधित मुद्दे