Question

J'essaie d'obtenir les valeurs d'un pointeur vers un tableau flottant, mais il renvoie sous la forme c_void_p en python

Le code C

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

Python jusqu'à présent

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

Le problème étant que null_ptr a une valeur int (adresse mémoire?) mais il n'y a aucun moyen de lire le tableau?!

Était-ce utile?

La solution

Mes types sont rouillés, mais je crois que vous voulez POINTER (c_float) au lieu de c_void_p.

Alors essayez ceci:

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

Autres conseils

Pour utiliser les ctypes d'une manière qui imite votre code C, je suggérerais (et je suis hors de pratique et cela n'a pas été testé):

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

Vous voudrez probablement aussi passer le null_ptr en utilisant byref, par exemple.

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

Lorsque vous transmettez des arguments de pointeur sans utiliser ctypes.pointer ou ctypes.byref, leur contenu est simplement défini sur la valeur entière de l'adresse de la mémoire (c'est-à-dire les bits du pointeur). Ces arguments doivent être passés avec byref (ou pointeur , mais byref nécessite moins de temps système):

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top