Domanda

Sto cercando di ottenere i valori da un puntatore a un array float, ma ritorna come c_void_p in python

Il codice C

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

Python finora

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

Il problema essendo null_ptr ha un valore int (indirizzo di memoria?) ma non c'è modo di leggere l'array ?!

È stato utile?

Soluzione

I miei tipi sono arrugginiti, ma credo che tu voglia POINTER (c_float) invece di c_void_p.

Quindi prova questo:

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

Altri suggerimenti

Per usare i ctypes in un modo che imita il tuo codice C, suggerirei (e sono fuori pratica e questo non è testato):

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

Probabilmente vorrai anche passare null_ptr usando byref, ad esempio

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

Quando si passano argomenti del puntatore senza usare ctypes.pointer o ctypes.byref, il loro contenuto viene semplicemente impostato sul valore intero dell'indirizzo di memoria (cioè i bit del puntatore). Questi argomenti dovrebbero essere passati con byref (o pointer , ma byref ha un sovraccarico minore):

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]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top