2009-05-06 63 views
4

我試圖從一個指向一個int數組獲取值,但它在PythonPython的雙指針

C代碼

double v; 
const void *data; 
pa_stream_peek(s, &data, &length); 
v = ((const float*) data)[length/sizeof(float) -1]; 

的Python迄今爲止

import ctypes 
null_ptr = ctypes.c_void_p() 
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length)) 
返回爲c_void_p

問題是null_ptr有一個int值(內存地址?),但沒有辦法讀取數組?

回答

3

我的ctypes是生鏽的,但我相信你想POINTER(c_float)而不是c_void_p。

那麼試試這個:

null_ptr = POINTER(c_float)() 
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length)) 
null_ptr[0] 
null_ptr[5] # etc 
+0

乾杯奏效傳遞指針(c_float)()完美地工作。我也增加了更新型的包裝像 從 pa_stream_peek.argtypes = [POINTER(pa_stream),POINTER(指針(無)),POINTER(c_size_t)] 到 pa_stream_peek.argtypes = [POINTER(pa_stream),POINTER(指針(c_float)),POINTER(c_size_t) ] 給予 data = POINTER(c_float)() pa_stream_peek(stream,data,ctypes.c_ulong(length)) v = data [0] – KillerKiwi 2009-05-06 20:09:41

0

你也可能會想使用按地址來傳遞NULL_PTR,例如

pa_stream_peek(stream, ctypes.byref(null_ptr), ctypes.c_ulong(length)) 
1

要模仿你的C代碼的方式使用ctypes的,我會建議(我外的做法,這是未經測試):

vdata = ctypes.c_void_p() 
length = ctypes.c_ulong(0) 
pa_stream_peek(stream, ctypes.byref(vdata), ctypes.byref(length)) 
fdata = ctypes.cast(vdata, POINTER(float)) 
0

當你通過指針參數而不使用ctypes.pointer或ctypes.byref,它們的內容只是設置爲內存地址的整數值(即指針位)。這些參數應與byref傳遞(或pointer,但byref開銷較少):

data = ctypes.pointer(ctypes.c_float()) 
nbytes = ctypes.c_sizeof() 
pa_stream_peek(s, byref(data), byref(nbytes)) 
nfloats = nbytes.value/ctypes.sizeof(c_float) 
v = data[nfloats - 1]