Python 双指针
我正在尝试从一个指向浮点数组的指针中获取值,但在Python中返回的是c_void_p。
这是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))
问题在于null_ptr有一个整数值(内存地址?),但没有办法读取这个数组?!
4 个回答
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]
1
如果你想用ctypes来模仿你的C代码,我建议你可以这样做(不过我有点生疏了,这个方法还没测试过):
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))
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