Funktionsaufruf int fn(T**)

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Shanajio
User
Beiträge: 5
Registriert: Freitag 5. März 2010, 09:45

Hallo!

Ich verwende eine externe Bibliothek, in der eine Funktion wie folgt definiert ist :

Code: Alles auswählen

int fn1(T** list)
und folgendes macht:

Wenn man fn1 aufruft, allokiert sie Speicher (für Listenelemente) und liefert diese Liste in list zurück und die Anzahl der Listenelemente als Rückgabewert der Funktion.

In C würde man wahrscheinlich folgendes schreiben:

Code: Alles auswählen

T* list;
int len;

len = fn1(&list);

for(int cnt=0; cnt < len; cnt++)
   do_something(list[cnt]);

Wie geht der Funktionsaufruf in Python mit ctypes?

Danke,
Shanajio
Shanajio
User
Beiträge: 5
Registriert: Freitag 5. März 2010, 09:45

Eines habe ich vergessen: T ist eine Struktur.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Hier steht doch alles ganz genau.

Sebastian
Das Leben ist wie ein Tennisball.
Shanajio
User
Beiträge: 5
Registriert: Freitag 5. März 2010, 09:45

Ich habe jetzt folgendes versucht:

Das ist die C-Definition vom struct T:

Code: Alles auswählen

typedef struct _ImgEntry
{ 
   enum ImgType  imgType;  
   enum DataType dataType; 
   void* data;        
   WORD  width;       
   WORD  height;      
}ImgEntry;
Ich habe es folgendermaßen in Python umgesetzt:

Code: Alles auswählen

class SR_IMG_ENTRY(ctypes.LittleEndianStructure):
    _fields_ = [ ('imgType', ctypes.c_int), 
                  ('dataType', ctypes.c_int),
                  ('data', ctypes.c_voidp),
                  ('width', ctypes.c_uint),
                  ('height', ctypes.c_uint) ]
LittleEndianStructure weil das auf Intel/Win ja so ist (oder?).

Danach habe ich einen Pointertyp erstellt und versucht die Methode aufzurufen:

Code: Alles auswählen

pSIE = ctypes.POINTER(SR_IMG_ENTRY)
imgList = pSIE()
len = libc.SR_GetImageList(ctypes.byref(imgList))
Und dann möchte ich gerne mit zB:

Code: Alles auswählen

imgList[0].imgType 
darauf zugreifen, aber die Daten ergeben keinen Sinn.

mfg,
Shanajio
Antworten