2013-10-02 66 views

回答

3

由於我一直在努力解決這個問題一段時間,所以我決定寫一個小小的HowTo,這樣其他人就可以受益。

有了這款C一段代碼:

void passPointerArray(int size, char **stringArray) { 
    for (int counter=0; counter < size; counter++) { 
    printf("String number %d is : %s\n", counter, stringArray[counter]); 
    } 
} 

我們要使用ctypes的(約ctypes的更多信息可以在以前的文章中找到)從蟒蛇調用它,所以我們寫下如下代碼:

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) 

現在,我讀它,它似乎很簡單,但我享受了很多找到適當的類型,請通過ctypes的,以避免分段錯誤...

+0

如果C函數修改字符串,用'create_string_buffer'創建'c_char'數組,例如'select =(POINTER(c_char)* len(string_set))(* map(create_string_buffer,string_set))'。 – eryksun

+0

然後我應該使用哪種參數類型? –

+0

如果類型安全不是問題,你可以使用'c_void_p'。這將接受任何指針類型。你也可以使用'POINTER(POINTER(c_char))'。但是,ctypes類型系統是不可寬恕的,所以如果你在'c_char_p'數組中混合,你必須首先''cast'以防止抱怨。 – eryksun