سؤال
وأنا أحاول الحصول على قيم من مؤشر إلى مجموعة تعويم، ولكنه يعود كما c_void_p في بيثون
والرمز C
double v;
const void *data;
pa_stream_peek(s, &data, &length);
v = ((const float*) data)[length / sizeof(float) -1];
وبيثون حتى الآن
import ctypes
null_ptr = ctypes.c_void_p()
pa_stream_peek(stream, null_ptr, ctypes.c_ulong(length))
وهذه القضية كونها null_ptr لها قيمة كثافة العمليات (عنوان الذاكرة؟)، ولكن ليس هناك طريقة لقراءة مصفوفة؟!
المحلول
وبلدي 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
(أو pointer
، ولكن 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]