Python双指针

时间:2009-05-06 05:23:05

标签: python ctypes

我正在尝试从指向浮点数组的指针获取值,但它在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的问题有一个int值(内存地址?)但是没有办法读取数组?!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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))

答案 2 :(得分:0)

你也可能想要使用byref传递null_ptr,例如

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

答案 3 :(得分: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]