2009-05-06 135 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]