سؤال

وأنا أحاول الحصول على قيم من مؤشر إلى مجموعة تعويم، ولكنه يعود كما 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]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top