質問

float配列へのポインターから値を取得しようとしていますが、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値(メモリアドレス?)がありますが、配列を読み取る方法はありませんか?

役に立ちましたか?

解決

私のctypesはさびていますが、c_void_pの代わりにPOINTER(c_float)が欲しいと思います。

だからこれを試してください:

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

他のヒント

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))

また、byrefを使用してnull_ptrを渡すこともできます。たとえば、

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

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]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top