Frage
Ich versuche, die Werte von einem Zeiger auf ein Float-Array zu erhalten, aber es gibt so c_void_p in Python
Der C-Code
double v;
const void *data;
pa_stream_peek(s, &data, &length);
v = ((const float*) data)[length / sizeof(float) -1];
Python so weit
import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
Die Frage die null_ptr sein hat einen int-Wert (Speicheradresse?), Aber es gibt keine Möglichkeit, das Array zu lesen?!
Lösung
Meine ctypes ist rostig, aber ich glaube, Sie POINTER (c_float) wollen statt c_void_p.
So versuchen Sie dies:
null_ptr = POINTER(c_float)()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
null_ptr[0]
null_ptr[5] # etc
Andere Tipps
Um ctypes in einer Weise zu nutzen, die Ihre C-Code nachahmt, würde ich vorschlagen (und ich bin out-of-Praxis, und dies ist nicht getestet):
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))
Sie werden wahrscheinlich auch die null_ptr sein wollen vorbei mit byref, z.
pa_stream_peek(stream, ctypes.byref(null_ptr), ctypes.c_ulong(length))
Wenn Sie Zeiger Argumente übergeben, ohne ctypes.pointer oder ctypes.byref, ihre einfach Inhalte auf den ganzzahligen Wert der Speicheradresse erhalten gesetzt (das heißt, der Zeiger Bits). Diese Argumente sollten mit byref
übergeben werden (oder pointer
, aber byref
hat weniger Overhead):
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]