2010-06-28 6 views
8

나는 'bar'함수에서 반환 값으로 주어진 구조체의 포인터를 함수 'foo_write'에 전달하려고합니다. 하지만 'TypeError : 줄'foo = POINTER (temp_foo)에 대한 ctypes 형식이어야합니다 '오류 메시지가 나타납니다. ctypes online help에서 'ctypes.POINTER'는 ctypes 유형에서만 작동합니다. 다른 방법을 알고 있습니까? 무엇을 추천하나요?ctypes에서 구조체에 대한 포인터를 반환하는 방법은 무엇입니까?

C :하는 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 * '를 반환하는 bar()를 사용 했습니까? – Clifford

+0

'from ctypes import *'를 생략 했습니까? – Clifford

답변

5

귀하의 bar 함수가 잘못된 정의가, 나는 당신이 struct FOO_ *bar(int); 의미 추측?

foo_parameter이 결코 선언되지 않는다는 점에서 파이썬 코드가 잘못되었습니다. 그래서 당신이하고 싶은 것을 100 % 확신하지 못합니다. 난 struct FOO_의 인스턴스입니다 foo, bar(int)struct FOO_에 대한 포인터를 얻을 귀하의 파이썬의 매개 변수를 전달하려는 가정합니다.

당신은 그렇게 포인터가 필요하지 않습니다, 다음 작동합니다 :하는 ctypes 이후

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

당신을 위해 포인터 - 투 - 구조체에 bar()의 반환 형식을 바꿈됩니다.

+0

안녕하세요, 당신이 지적한대로 당신을 선택했는데, 나는 ctypes가 필요하지 않습니다 .POINTER. – Framester

+3

foo는 클래스 명인가, 변수인가? c_types는 막대의 반환 유형이 'foo'임을 어떻게 알 수 있습니까? – fadedbee

+0

foo는 클래스와 변수 이름입니다. – Overdrivr

관련 문제