2016-06-18 20 views
-1

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.

+2

"* es funktioniert nicht *" ist keine Problembeschreibung. – melpomene

+0

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

+0

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. –

Antwort

1
static int nmode = 0; 

Wenn Sie diese Zeile in beiden Dateien einschließlich sind, dann haben Sie zwei nmode Variablen, eine in jeder Datei. Die static macht das Symbol privat zu der Übersetzungseinheit.

Stattdessen möchten Sie wahrscheinlich

int nmode; 

in einer Datei, und

extern int nmode; 

in der anderen. (Es ist nicht notwendig, es explizit auf Null zu initialisieren. Das ist für den statischen Speicher garantiert.)