Pregunta
Estoy tratando de obtener los valores de un puntero a una matriz flotante, pero regresa como c_void_p en python
El código C
double v;
const void *data;
pa_stream_peek(s, &data, &length);
v = ((const float*) data)[length / sizeof(float) -1];
Python hasta ahora
import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
El problema es que null_ptr tiene un valor int (¿dirección de memoria?) pero no hay forma de leer la matriz ?!
Solución
Mis ctypes están oxidados, pero creo que quieres POINTER (c_float) en lugar de c_void_p.
Así que prueba esto:
null_ptr = POINTER(c_float)()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
null_ptr[0]
null_ptr[5] # etc
Otros consejos
Para usar ctypes de una manera que imite su código C, sugeriría (y estoy fuera de práctica y esto no ha sido probado):
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))
También es probable que desee pasar el null_ptr usando byref, por ejemplo,
pa_stream_peek(stream, ctypes.byref(null_ptr), ctypes.c_ulong(length))
Cuando pasa argumentos de puntero sin usar ctypes.pointer o ctypes.byref, su contenido simplemente se establece en el valor entero de la dirección de memoria (es decir, los bits de puntero). Estos argumentos deben pasarse con byref
(o pointer
, pero byref
tiene menos sobrecarga):
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]