2013-10-02 3 views

답변

3

저는 얼마 동안이 문제에 어려움을 겪었으므로 다른 사람들이 혜택을 얻을 수 있도록 작은 HowTo를 작성하기로했습니다.

이 코드 C 조각을 갖는

우리는 (하는 ctypes에 대한 자세한 정보는 이전 포스트에서 찾아 볼 수있다)하는 ctypes를 사용하여 파이썬에서 호출 할, 그래서 우리는 다음과 같은 코드를 적어
void passPointerArray(int size, char **stringArray) { 
    for (int counter=0; counter < size; counter++) { 
    printf("String number %d is : %s\n", counter, stringArray[counter]); 
    } 
} 

:

def pass_pointer_array(): 
    string_set = [ 
    "Hello", 
    "Bye Bye", 
    "How do you do" 
    ] 

    string_length = len(string_set) 

    select_type = (c_char_p * string_length) 
    select = select_type() 

    for key, item in enumerate(string_set): 
    select[key] = item 

    library.passPointerArray.argtypes = [c_int, select_type] 
    library.passPointerArray(string_length, select) 

지금 나는 그것을 읽어 매우 단순하게 나타납니다,하지만 난 C 함수가 문자열을 수정하는 경우

+0

... 세그멘테이션 오류를 방지하기 위해하는 ctypes에 전달할 적절한 유형을 찾는 많은 즐길 , 'create_string_buffer'로'c_char' 배열을 만듭니다. 'select = (POINTER (c_char) * len (string_set)) (* map (create_string_buffer, string_set))'를 호출한다. – eryksun

+0

그리고 어떤 arg 유형을 사용해야합니까? –

+0

타입 안전성에 문제가 없다면'c_void_p'를 사용할 수 있습니다. 그러면 모든 포인터 유형을 사용할 수 있습니다. 'POINTER (POINTER (c_char))'도 사용할 수 있습니다. 그러나 ctypes 타입 시스템은 용서할 수 없으므로,'c_char_p' 배열로 믹싱을한다면 우선'cast'해야만 징징 거리지 않게됩니다. – eryksun