Objektorienierte C-dll in Python einbinden
Verfasst: Freitag 22. Februar 2013, 13:27
Ich habe ein C Programm, das (ansatzweise) objektorienitert verfasst ist. Hierbei wird eine Datenstruktur generiert und als Referenz an die Funktionen übergeben. Die Funktionen arbeiten im Hintergrund immer mit dieser Datenstruktur!
Ich habe aus den Funktionenen und deren Unterfunktionen eine dll generiert. Ich möchte diese Funktionen via ctypes in Python als module einbinden. Ich habe bereits etwas mit ctypes und Python gearbeitet. Allerdings kenne ich mich mit ctypes und Python nicht wirkich aus (Bin C-Coder). Ich habe zwar bereits ein kleines Beispielprogramm via ctypes in Python zum Laufen gebracht. Aber beim konkreten Problem meckert ctypes z.B. bei "_fields_ rum wenn ich versuche eine Structure mit einem einzigen Element anzulegen(Class via Structure erstellen). Habe auch versucht, einfach mal ein array direkt aus dem channel_t zu generieren. Allerdings habe ich mit der Pointerdarstellung immense Probleme.
Kann mir bitte jemand helfen? Ein Beispielprogramm wäre super. Vor allem bräuchte ich Hilfe beim Pointerzeugs.
Hier die benötigten Structs:
Hier die function prototypes:
Hier ein main program:
Ich habe aus den Funktionenen und deren Unterfunktionen eine dll generiert. Ich möchte diese Funktionen via ctypes in Python als module einbinden. Ich habe bereits etwas mit ctypes und Python gearbeitet. Allerdings kenne ich mich mit ctypes und Python nicht wirkich aus (Bin C-Coder). Ich habe zwar bereits ein kleines Beispielprogramm via ctypes in Python zum Laufen gebracht. Aber beim konkreten Problem meckert ctypes z.B. bei "_fields_ rum wenn ich versuche eine Structure mit einem einzigen Element anzulegen(Class via Structure erstellen). Habe auch versucht, einfach mal ein array direkt aus dem channel_t zu generieren. Allerdings habe ich mit der Pointerdarstellung immense Probleme.
Kann mir bitte jemand helfen? Ein Beispielprogramm wäre super. Vor allem bräuchte ich Hilfe beim Pointerzeugs.
Hier die benötigten Structs:
Code: Alles auswählen
typedef struct channel_tag channel_t;
struct channel_tag {
unsigned short *bla;
unsigned short *muh;
unsigned short type;
unsigned char ch_number;
};
/*---*/
typedef struct tag gen_t;
struct tag {
channel_t channel_number[16];
};
Hier die function prototypes:
Code: Alles auswählen
unsigned short ctor(gen_t *me);
/*---*/
unsigned short channel_ctor(channel_t *, unsigned short, unsigned short, unsigned short);
/*---*/
void copy_data(unsigned short *data);
/*---*/
void update_all_channels(void);
Code: Alles auswählen
gen_t gen;
void main(){
int i;
unsigned short output[256][16];
ctor(&gen); //Rückgabewert wichtig, hier wird es initialisiert
channel_ctor(&gen.channel_number[0], 1, 20, 50);//Rückgabewert wichtig, hier wird ein channel aus der konkreten Datensturktur initialisiert
for(i = 0; i < 256; i++){
copy_data((unsigned short)(&output[i]));//Kopiere generierte Daten
update_all_channels();//Berechne neue Daten -> nutzt gen Datenstruktur im Hintergrund
}
}