2013-10-15 3 views
0

ctypes를 통해 공용체 배열을 내 C++ DLL에 전달하려고하는데 저는 Python을 처음 접했습니다. 예를 들어, 다음과 같이 축약 형 방법으로 구성 할 수 있습니다.건설시 공용 구조체 값을 지정하는 방법

class MyValue(Union): 
    _fields_ = [ 
    ("ftNone" , c_void_p), 
    ("ftString", c_char_p), 
    ("ftInt" , c_int ), 
    ("ftBigInt", c_long ), 
    ("ftFloat" , c_char_p) 
    ] 
MyValues = MyValue * 20 

CMethod(MyValues(
('ftInt' = 12), 
('ftString' = 'testing') 
)) 

또는 더 좋은 방법이 있습니까? 기본적으로 여러 유형의 배열을 내 DLL에 전달하려고합니다.

+0

@eryksun : 사용하지 않는 경우이 기능을 구현하고 있습니다. – Geoffrey

답변

1

ctypes 배열은 위치 지정 인수로 초기화됩니다. 초기 값은 ctypes 데이터 객체, 간단한 데이터 유형 (간단한 유형의 배열 인 c_int * 20)과 호환되는 Python 객체 또는 배열의 데이터 유형의 임시 인스턴스를 생성하는 데 사용되는 위치 지정 인수의 튜플이 될 수 있습니다 어레이에 (memcpy)을 복사합니다.

적절한 변환기를 선택하려면 키워드 인수가 필요하므로 수동으로 임시 인스턴스를 만들려면 MyValue으로 전화하거나 Unitialized 배열의 각 항목에 setattr을 호출해야합니다.

values = [ 
    ('ftInt', 12), 
    ('ftString', 'testing'), 
] 

arr = MyValues(*(MyValue(**{k: v}) for k, v in values)) 

을 그리고 여기에 루프에서 배열 업데이트 할 setattr를 사용하여 대안입니다 : : 전자를 들어, * 포장을 풀고 **과 결합 된 발전기 식을 사용합니다 (tutorial 참조)

arr = MyValues() 
for item, value in zip(arr, values): 
    setattr(item, *value) # note the * unpacking 

키워드 인수 dict에 대한 지원을 _PyCData_set (모듈/ctypes/_ctypes.c)에 추가하는 것이 좋습니다.

관련 문제