سؤال

ولقد يعدون لDLL للسائق في C. كتبت برنامج اختبار في C ++ وDLL يعمل بشكل جيد.

والآن أود أن interract مع هذا DLL باستخدام بيثون. لقد مخبأة بنجاح معظم يحددها المستخدم الهياكل C ولكن هناك نقطة واحدة حيث لا بد لي من استخدام الهياكل C. أنا جديدة بدلا من الثعبان لذلك أنا قد تحصل على أشياء خاطئة.

وأسلوبي هو إعادة تعريف بعض الهياكل في بيثون باستخدام الأساسية CType ثم تمرير المتغير لبلدي DLL. ولكن في هذه الطبقة لدي قائمة مرتبطة العرف الذي يحتوي على أنواع متكررة على النحو التالي

class EthercatDatagram(Structure):
    _fields_ = [("header", EthercatDatagramHeader),
                ("packet_data_length", c_int),
                ("packet_data", c_char_p),
                ("work_count", c_ushort),
                ("next_command", EthercatDatagram)]

وهذا فشل، لأن داخل EthercatDatagram، لم يتم تعريف EthercatDatagram ذلك بالفعل إرجاع محلل خطأ.

وكيف يجب أن تمثل هذه القائمة المرتبطة في بيثون بحيث بلدي DLL يفهم بشكل صحيح؟

هل كانت مفيدة؟

المحلول

وأنت تريد يكاد يكون من المؤكد أن يعلن NEXT_COMMAND كمؤشر. وجود بنية يحتوي على نفسها ليس من الممكن (في أي لغة).

وأعتقد أن هذا هو ما تريد:

class EthercatDatagram(Structure):
    pass
EthercatDatagram._fields_ = [
    ("header", EthercatDatagramHeader),
    ("packet_data_length", c_int),
    ("packet_data", c_char_p),
    ("work_count", c_ushort),
    ("next_command", POINTER(EthercatDatagram))]

نصائح أخرى

والسبب

EthercatDatagram._fields_.append(("next_command", EthercatDatagram))

ولا يعمل هو أن الآلية التي تخلق الكائنات واصف (انظر مصدر في PyCStructType_setattro وظيفة ) للوصول إلى السمة next_command يتم تنشيط فقط على احالة إلى السمة _fields_ الطبقة. إلحاق مجرد حقل جديد إلى القائمة تطول دون أن يلاحظها أحد تماما.

لتجنب هذا المأزق، استخدم دائما الصفوف (tuple) (وليس قائمة) حيث بلغت قيمة السمة _fields_: من شأنها أن تجعل من الواضح أن لديك لتعيين قيمة جديدة إلى السمة وليس تعديله في مكان <. / P>

وسيكون لديك للوصول _fields_ بشكل ثابت بعد أن كنت قد إنشائه.

class EthercatDatagram(Structure)
  _fields_ = [...]

EthercatDatagram._fields_.append(("next_command", EthercatDatagram))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top