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

¿Fue útil?

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]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top