2009-05-06 14 views
4

Ich versuche, die Werte von einem Zeiger auf ein Float-Array zu erhalten, aber es gibt so c_void_p in PythonPython Doppelzeiger

Die C-Code

double v; 
const void *data; 
pa_stream_peek(s, &data, &length); 
v = ((const float*) data)[length/sizeof(float) -1]; 

Python bisher

import ctypes 
null_ptr = ctypes.c_void_p() 
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length)) 

Das Problem, das die null_ptr ist, hat einen int-Wert (Speicheradresse?), Aber es gibt keine Möglichkeit, das Array zu lesen ?!

Antwort

3

Mein Ctypes ist rostig, aber ich glaube, dass Sie POINTER (c_float) anstelle von c_void_p wollen.

diese So versuchen:

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

Prost, der in dem POINTER vorbei gearbeitet (c_float)() funktionierte perfekt .. Ich füge auch die Art Wrapper zu aktualisieren wie von pa_stream_peek.argtypes = [POINTER (pa_stream), Zeiger (ZEIGER (None)), Zeiger (c_size_t)] zu pa_stream_peek.argtypes = [POINTER (pa_stream), Zeiger (ZEIGER (c_float)), Zeiger (c_size_t) ] geben data = POINTER (c_float)() pa_stream_peek (Strom, Daten, ctypes.c_ulong (Länge)) v = Daten [0] – KillerKiwi

0

Sie werden auch wahrscheinlich wollen die null_ptr mit byref zu vorbei, z.B.

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

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

Wenn Sie Zeiger Argumente übergeben ohne ctypes.pointer oder ctypes.byref zu verwenden, wird ihr Inhalt einfach auf den ganzzahligen Wert der Speicheradresse gesetzt (dh die Zeigerbits). Diese Argumente sollen 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] 
Verwandte Themen