2009-12-02 7 views
4

파이썬에서 공유 객체에있는 C 함수를 호출하려고하는데 ctypes를 사용하면이 작업을 수행하는 가장 좋은 방법 인 것 같습니다. Config 구조체구조체에 대한 포인터가있는 ctypes를 사용하여 함수 호출

typdef struct { double x, y, area } Coord ; 

파이썬하는 ctypes로 정의

typedef struct{ char *some_filename ; 
       char **some_other_filenames ; 
       int some_value ; 
       Coord resolution; 
       } Config; 

Coord로 정의

int MyFunc (Config *config, int *argc, char **argv) 

: I는 다음 함수 원형으로,이 함수에 유래 타입을 전달해야 코드는 파생 된 유형의 재 작성에 불과합니다.

class COORD (ctypes.Structure): 
     _fields = [ ("lon",ctypes.c_double),\ 
     ("lat", ctypes.c_double),\ 
     ("area", ctypes.c_double)] 
coords = COORD() 
class CONFIG(ctypes.Structure): 
     _fields = [ ("some_filename", ctypes.c_char_p),\ 
     ("some_other_filenames", ctypes.c_char_p('\0' * 256)),\ 
     ("some_value", ctypes.c_int),\ 
     ("resolution", coords) ] 

그때 MyFunc의 인수를 설정 :

MyFunc.argtypes = [ctypes.byref(CONFIG) , ctypes.POINTER(ctypes.c_int),\ 
     ctypes.POINTER (ctypes.c_char_p)] 
MyFunc.restype = ctypes.c_int 
myargv = ctypes.c_char_p * 2 
argv = myargv("One", "Two") 
argc = ctypes.c_int (2) 
retval = MyFunc ( ctypes.byref(config), ctypes.byref(argc), ctypes(argv)) 

이것은, 그러나, 세그먼트 폴트를 생성합니다. 누구든지 여기에 무슨 일이 일어나고 있는지 아이디어가 있습니까?

업데이트 커팅 및 붙여 넣기에서 내 질문에 오타가 있었지만 문제가 여전히 있습니다.

답변

1

다시 작성한 구성 구조가 원래 것과 같지 않습니다. 당신이 앞뒤로 그것을 통과한다면 정렬은 꺼져있을 것이다.

편집 : 일부 수정되었습니다. 하지만 c_char_p가 char **와 동일하지는 않습니다.

+0

맞습니다. 정수 구성원이 누락되었습니다. 나는 지금 그것을 편집했다. 그러나 이것은 나에게 문제를 자르고 붙이기 만하고있는 나이었다! 감사! – Jose

2

char **는 POINTER (c_char_p)에 해당하고 c_char_p에는 해당하지 않습니다.

관련 문제