Einen Array in verschiedenen Dateien benutzen



  • Hallo C Freunde,

    Ich habe folgende Hürde: Ich möchte einen zweidimensionalen Array (Adjazenzmatrix) mit Samt aller Funktionen in zwei verschiedenen C Dateien verwenden.

    Ich habe dazu eine Header Datei mit dem Titel adjMat.h und inkludiere sie in den beiden C Dateien. Der Fehler, den ich dadurch bekomme, sieht folgendermaßen aus:

    ../src/adjMat.h:67: first defined here
    

    Ich habe vom Schlüsselwort extern gelesen. Wenn ich den aber so vor meinen Array in der header Datei schreibe...:

    extern int adjMat_distance[MATRIX_SIZE][MATRIX_SIZE];
    extern char *adjMat_node[MATRIX_SIZE];
    extern int adjMat_length = 0;
    

    ... so erhalte ich noch mehr Fehler.

    In function `adjMat_show':
    des-fb13_routingTable.c:(.text+0x69f): undefined reference to `adjMat_node'
    des-fb13_routingTable.c:(.text+0x6e3): undefined reference to `adjMat_node'
    des-fb13_routingTable.c:(.text+0x71e): undefined reference to `adjMat_distance'
    

    Das zeigt er mir für alle Funktionen an. Er kennt die Arrays nach dem Bezeichnen mit extern gar nicht mehr. 😮

    Was mache ich falsch bzw muss ich ändern? 😕



  • Hi,

    ich mache es immer so,

    In der Main Datei

    int g_var_1;
    char g_var_2;
    
    void main(void){
    ...
    }
    

    in der Header Datei

    extern int g_var_1;
    extern char g_var_2;
    

    Dann geht alles super. Aber bitte beachte, dass Du in header den globalen Variablen keine Zuweisung geben kannst

    extern int adjMat_length = 0;
    

    Das musst Du dann z.B. in der main am Anfang machen.



  • Vielen Dank erstmal für diese rasche Antwort. Ich habe es so gemacht wie du, habe dazu die Datei mit extern versehen. Das Problem ist nur, dass er dann plötzlich meint, dass es innerhalb der Funktionen, die ebenfalls in der Header Datei definiert sind, undefinierte Referenzen zu den globalen Dateien gibt.

    Offensichtlich können Funktionen, die in derselben Header Datei definiert sind wie die globalen Variablen, mit diesen globalen Variablen nicht zurechtkommen...

    Sollte man die Funktionen auf andere Header Dateien verlegen?



  • Also noch einmal. Wir haben 3 Dateien

    main.c

    #include "header.h"
    int g_var;
    
    void main(void){
    g_var = 0;
    }
    

    header.h

    extern int g_var;
    
    extern void function1(void);
    

    funktion1.c

    #include "header.h"
    void function1(void){
    g_var = 1;
    }
    


  • Genau das mache ich ja, wie bereits oben beschrieben. Ich habe folgende Header Datei:

    typedef struct list_el ENTRY;
    struct list_el{
    	char *val;
    	int counter;
    	struct list_el *next;
    	struct list_el *prev;
    };
    
    extern ENTRY *head;
    extern int ll_size;
    
    extern ENTRY *ll_getHead();
    extern void ll_add(char *val)
    

    Ich habe folgende C Datei:

    #include "des-fb13_linkedList.h"
    
    ENTRY *ll_getHead(){
    	return head;
    }
    
    void ll_add(char *val){
    	ENTRY *curr;
    	curr = (ENTRY *) malloc(sizeof(ENTRY));
    	curr->val = val;
    	curr->counter = DEFAULT_COUNTER;
    	curr->next = head;
    	if(!head) head->prev = curr;
    	head = curr;
    	ll_size++;
    }
    

    Dazu erhalte ich folgende Fehlermeldung:

    fb13_linkedList.c:4: undefined reference to `head'
    

    Das heißt, dass er die Referenz zu head nicht kennt. Was soll das? 😞



  • Habe das Problem gelöst. Bei externen Variablen muss man sie in der Datei, in der man die Header Datei inkludiert, nochmal deklareireren. Damit gehts!



  • Nur profilaktisch: die "extern" Variablen dürfen aber nur in einer c-Datei deklariert werden (sonst kannst du dir den Header sparen). Am sinnvollsten die, zu der der Header gehört.
    Mit "extern" machst du eine Variable quasi nur bekannt (es gibt sie irgendwo, der Linker soll mal suchen). Da ist sie nur, wenn sie irgendwo auch angelegt wird.

    PS: Bevor sich wieder einer darüber auslässt, dass ich alte Threads rauskrame: es soll ja Leute geben, die die Suchfunktion benutzen um eine Lösung zu finden. Wäre doch super, wenn dort auch eine steht!


Anmelden zum Antworten