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

Foi útil?

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]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top