Ich habe eine C-Funktion (store_mode_ - definiert in file_A.c), die in einem Fortran-Code aufgerufen wird.Wie füllt man eine in einer .c-Datei definierte Struktur in einer Funktion, die in einer anderen .c definiert ist, ohne den Zeiger als Argument zu übergeben?
Es sieht wie folgt aus ..
// Create a global structure to populate with current mode frequencies
struct minos_modes current_modes;
static int nmode = 0;
void
store_mode_(int *n, int *l, double *w, double *U)
{
if (nmode == MODE_MAX)
{
printf("[ store_mode_ ] Error: MODE_MAX is too small\n");
exit(1);
}
current_modes.mode_n[nmode] = *n;
current_modes.mode_l[nmode] = *l;
current_modes.mode_w[nmode] = *w;
current_modes.mode_U[nmode] = *U;
nmode += 1;
current_modes.len = nmode;
}
Ich versuche, eine Struktur mit den Werten (n, l, w, U) als Argumente in dem Fortran-Aufruf übergeben zu füllen. Der obige Code funktioniert, wenn er direkt über meiner Hauptdatei in File_B.c definiert wird, die den Fortran-Code darin aufruft.
Allerdings .. Wenn ich die obige Funktion in file_A.c (die, die main nicht ist) definieren, funktioniert es nicht. Ich schätze das liegt an dem Fehlen von globalen Shares zwischen .c-Dateien. Ich habe mich gefragt, ob es dafür eine Lösung gibt? Vielleicht mit extern, obwohl ich ein wenig ohne Erfolg gespielt habe.
"* es funktioniert nicht *" ist keine Problembeschreibung. – melpomene
definieren und enthalten Sie diese Symbole aus Header-Dateien? Während der Kompilierzeit muss der Compiler wissen, dass es ein store_mode-Symbol gibt, dann verbinden Sie die Objektdateien bei der Verknüpfungszeit mit der Definition dieser Symbole – kirinthos
Sie müssen wissen, wo die Struktur definiert ist; Diese Datei muss mit der ausführbaren Datei verknüpft werden. Andere Dateien können den Header enthalten, der die Struktur deklariert und dann darauf zugreift. Der Header sollte etwas wie 'extern struct minos_modes current_modes;' enthalten und muss auch die Details der Strukturdefinition kennen. Die Datei, die die Struktur definiert, sollte auch den Header enthalten, so dass der Compiler eine Gegenprüfung durchführen kann. –