Pergunta
Eu estou tentando obter os valores a partir de um ponteiro para uma matriz float, mas ele retorna como c_void_p em python
O código C
double v;
const void *data;
pa_stream_peek(s, &data, &length);
v = ((const float*) data)[length / sizeof(float) -1];
Python até agora
import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
A questão de ser o null_ptr tem um valor int (endereço de memória?), Mas não há nenhuma maneira de ler a matriz?!
Solução
As minhas ctypes é enferrujado, mas eu acredito que você quer Pointer (c_float) em vez de c_void_p.
Então, tente o seguinte:
null_ptr = POINTER(c_float)()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
null_ptr[0]
null_ptr[5] # etc
Outras dicas
Para usar ctypes de uma maneira que imita o seu código C, gostaria de sugerir (e eu estou fora de prática e isso é não testado):
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))
Você também provavelmente vai querer estar passando o null_ptr usando byref, por exemplo.
pa_stream_peek(stream, ctypes.byref(null_ptr), ctypes.c_ulong(length))
Quando você passar argumentos de ponteiro sem usar ctypes.pointer ou ctypes.byref, seu conteúdo simplesmente ficar pronto para o valor inteiro do endereço de memória (ou seja, os bits de ponteiro). Estes argumentos devem ser passados ??com byref
(ou pointer
, mas byref
tem 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]