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?!

War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top