Ich habe eine Funktion in meiner C-Bibliothek, sagen wir runsim()
was einen Zeiger auf nimmt struct repdata
als eines der Argumente, wo struct repdata
wird von gegeben
struct repdata {
int *var1;
int *var2;
int *var3;
char *var4;
double *var5;
double *var6;
int *var7;
};
Wenn ich ausschließlich C verwende, initialisiere ich eine Variable vom Typ struct repdata
Aufruf der Funktion,
struct repdata data;
void create_data_container(struct repdata *data, int len_data)
{
data -> var1 = malloc( sizeof(int) * len_data );
data -> var2 = malloc( sizeof(int) * len_data );
data -> var3 = malloc( sizeof(int) * len_data );
data -> var4 = malloc( sizeof(char) * len_data );
data -> var5 = malloc( sizeof(double) * len_data);
data -> var6 = malloc( sizeof(double) * len_data);
data -> var7 = malloc( sizeof(int) * len_data);
}
und dann diese Struktur füllen, während die Simulation fortschreitet. Nachdem ich die Daten in eine Datei geschrieben habe, gebe ich den Speicher per Standard frei
free(data.var1);
free(data.var2);
.
.
.
free(data.var7);
Ich möchte die anrufen runsim()
Funktion aus Python mit Python Ctypes. Dazu muss ich einen Zeiger auf eine Variable übergeben (das entspricht dem Typ von struct repdata
) als einer der runsim()
Argumente. Angenommen, ich habe in Python ein Äquivalent von definiert struct repdata
auf folgende Art.
import ctypes as C
class Repdata(C.Structure):
_fields_ = [
("var1", C.POINTER(C.c_int)),
("var2", C.POINTER(C.c_int)),
("var3", C.POINTER(C.c_int)),
("var4", C.POINTER(C.c_char)),
("var5", C.POINTER(C.c_double)),
("var6", C.POINTER(C.c_double)),
("var7", C.POINTER(C.c_int)),
]
Was ist das Äquivalent von create_data_container
oben gezeigte Funktion auf der Python-Seite? Ich möchte eine Instanz von Repdata initialisieren, die an C-Code übergeben werden kann und über ausreichend Speicher zum Speichern der Replikationsdaten verfügt. Und wie gebe ich nach Abschluss der Simulation den Speicher von Python frei?
Ich verwende Ubuntu Linux 12.04.
Vielen Dank im Voraus für Ihre Hilfe.