Seite 1 von 1

Funktionsaufruf int fn(T**)

Verfasst: Freitag 5. März 2010, 10:03
von Shanajio
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

Verfasst: Freitag 5. März 2010, 10:11
von Shanajio
Eines habe ich vergessen: T ist eine Struktur.

Verfasst: Freitag 5. März 2010, 10:18
von EyDu
Hallo und willkommen im Forum!

Hier steht doch alles ganz genau.

Sebastian

Verfasst: Freitag 5. März 2010, 11:02
von Shanajio
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