2017-03-16 12 views
1

타사 C에 정의 된 구조체 ++ 라이브러리는 다음과 같습니다ctypes와 cython 사이의 꼬리 부분을 처리하는 방법은 무엇입니까?

struct CSomeStruct { 
    double a; 
    char b; 
    int c; 
} 

하는 ctypes를 사용하여 내 사이 썬 프로젝트에 정의 된 같은 구조는 다음과 같습니다

class PSomeStructParent(ctypes.Structure): 
    _fields_ = [ 
     ('a', c_double), 
     ('b', c_char) 
    ] 
class PSomeStruct(PSomeStructParent): 
    _fields_ = [ 
     ('c', c_int) 
    ] 

가 왜 비슷한 많은 있기 때문에 상속이 사용 같은 공통 영역 (100 개 이상)을 가진 구조. 그러나 C++ 라이브러리는 각각의 구조체에서이를 정의했습니다. C++과 ctypes에는 동일한 기본 패딩 패딩 8이 있습니다. 따라서 이러한 구조를 C++과 cython 사이에서 전송하면 메모리 버퍼가 다르고 올바르게 캐스팅 될 수 없습니다.

sizeof(CStruct) = sizeof(double)+sizeof(char)+3+sizeof(int) = 8+1+3+4 = 16 
sizeof(PStruct) = sizeof(c_double)+sizeof(c_char)+7+sizeof(int)+4 = 8+1+7+4+4=24 

ctypes 테딩 패딩을 처리 할 수있는 방법이 있으며 제 3 자 라이브러리에 전송할 수 있습니까? 나는 많은 분야를 반복적으로 정의 할 수는 없다.

답변

1
shared_fields = [ 
    ('a', ctypes.c_double), 
    ('b', ctypes.c_char) 
] 

class PSomeStruct(ctypes.Structure): 
    _fields_ = shared_fields + [('c',ctypes.c_int)] 

필자는 파이썬을 사용하여 필요한 목록을 작성하고 중복을 최소화 할 수있는 목록으로 필드를 정의합니다.