2011-03-07 25 views
1

我正在封裝一個使用回調作爲外部內存分配器的C庫。基本上,它不是做malloc並釋放它本身,而是暴露幾個回調來製作指定大小的緩衝區。用ctypes連接起來相當容易,而且所有這些似乎都在起作用。不過,我似乎無法將陣列連接到在傳遞的指針C函數傳遞一個指針和一個長度,並且一個Python回調需要創建一個數組並分配它

C接口看起來是這樣的:

extern int (*alloc_int_buffer_callback)(some_struct* buffer, uint32_t length); 

我有過的ctypes定義的結構,它似乎完美匹配。

的ctypes的回調是這個樣子:

_int_functype = CFUNCTYPE(c_int, POINTER(some_struct), c_uint) 

我遇到的問題是,試圖讓指針(some_struct)實例的類型的數組(c_int的*長)點沒有按」 t似乎工作。這裏的回調我有現在:

def _alloc_struct_buffer(ptr, length): 
    arr_type = SomeStruct * length 
    arr = arr_type() 

    ptr.contents = cast(addressof(arr), POINTER(SomeStruct)) 

    return 1 

不幸的是,我沿着「預期SomeStruct代替LP_SomeStruct」的線得到一個錯誤。我錯過了什麼?

+1

您的C原型的返回類型爲int *,而您的ctypes原型的返回類型爲int。哪一個是對的? – 2011-03-07 20:22:36

+0

哎呦,我打錯了。謝謝你的收穫。 – 2011-03-07 20:25:45

回答

1

如果你想在一個參數返回一個指針,你需要在一個指針傳遞給一個指針:

extern int alloc_int_buffer_callback(some_struct **buffer, uint32_t length); 

如果你只是傳遞一個指針,改變指針的函數內什麼都不做,因爲你按值傳遞了指針。

裏面你的Python回調,你可以改變原型後使用

ptr.contents = cast(arr, POINTER(SomeStruct)) 

+0

不幸的是,當C代碼嘗試訪問內存時,我現在正在收到段錯誤。 – 2011-03-07 22:34:38

+0

@Lee:您需要在一些更持久的Python數據結構中存儲對'arr'的引用。如果您只在回調中在本地創建它,則會立即收集垃圾。 – 2011-03-08 09:05:30

+0

我不能相信我錯過了那個。有些日子我想知道我如何養活自己。謝謝。 – 2011-03-08 16:15:23

相關問題