Вопрос

Я пытаюсь получить значения из указателя на массив с плавающей точкой, но в python он возвращается как c_void_p

Код C

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

Python до сих пор

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

Проблема в том, что null_ptr имеет значение int (адрес памяти?), но нет способа прочитать массив?!

Это было полезно?

Решение

Мой ctypes ржавый, но я считаю, что вы хотите POINTER (c_float) вместо c_void_p.

Так что попробуйте:

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

Другие советы

Чтобы использовать ctypes таким образом, чтобы имитировать ваш код на C, я бы предложил (и я не практикую, и это не проверено):

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

Вы также, вероятно, захотите передать null_ptr с помощью byref, например.

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

Когда вы передаете аргументы указателя без использования ctypes.pointer или ctypes.byref, их содержимое просто устанавливается в целочисленное значение адреса памяти (то есть биты указателя). Эти аргументы должны передаваться с помощью byref (или указатель , но byref имеет меньше служебных данных):

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]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top