ctypes und Structure

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
derbernd
User
Beiträge: 13
Registriert: Montag 6. Oktober 2014, 08:19

Montag 22. August 2016, 16:58

Hallo,
ich habe erneut eine Frage zur Verwendung von ctypes.

Ich möchte eine c-Funktion innerhalb meines Programms verwerden. Aus der Header-Datei habe ich folgende Definition gefunden:

Code: Alles auswählen

extern unsigned DLLAPI  DoPECurrentData(
DoPE_HANDLE  DoPEHdl,
DoPEData  *Sample)
wobei DoPEData folgendermaßen definiert ist.

Code: Alles auswählen

  typedef  struct                      /* Default measuring data record      */
    {                                  /* ---------------------------------- */
      unsigned long  Cycles;           /* Cycle counter                      */
      double         Time;             /* Time from subsystem                */
	....
      unsigned short GoneKeys;         /* Gone keys                          */
    } DoPEData;
in python habe ich folgende Structure angelegt:

Code: Alles auswählen

class DoPEData(Structure):
    _fields_ = [("Cycles",c_ulong),#;           /* Cycle counter                      */
        ("Time",c_double),#;             /* Time from subsystem                */
		...
        ("GoneKeys",c_ushort),#;         /* Gone keys                          */
    ]
Der Funktionsaufruf müsste im Programm folgendermaßen funkionieren.

Code: Alles auswählen

err = self.__lib.DoPECurrentData(self.__handle, ???)
Leider kann ich die Referenz nicht übergeben und erhalte eine Fehlermeldung.

Wie müsste ich die Übergabe korrekt formulieren?
Danke
BlackJack

Montag 22. August 2016, 17:11

@derbernd: Du musst ein Exemplar von der Struktur erstellen (sofern Du nicht schon eines von irgendwoher hast welches Du verwenden möchtest) und dann ein Zeigerobjekt auf dieses `DoPEData`-Exemplar übergeben. Wenn das Zeigerobjekt nur als Argument für diesen Aufruf existieren muss, dann geht das mit `ctypes.byref()`, sonst muss man ein reguläres Zeigerobjekt mit der `ctypes.pointer()`-Funktion erstellen.

Edit: Die doppelten führenden Unterstriche solltest Du in maximal einen ändern. Die doppelten bedeuten und machen ziemlich sicher nicht das was Du denkst. Wenn Du das aus einem Buch oder Tutorial hast, dass das ”private” bedeutet: sofort verbrennen. ;-)
Antworten