[Linker error] undefined reference to

N'abend,
zur Zeit programmieren ein Freund und ich an einem kleinen textbasierten Rollenspiel. Dabei nutzen wir einen struct um die Charaktereigenschaften in "einem Packen" nutzen zu können. Dieses struct ist global definiert. Nun machen wir eine Art Vordeklaration von einer Funktion, die später noch kommt (spielemenue), damit ich sie in der Funktion neues_spiel nutzen kann (hat uns unserer Lehrer so gesagt).
Code:
typedef struct chark
{
        char name[30], klasse[10];
        int  level, staerke, vert, bew, gesund;                 

};
int spielemenue(chark *);
int neues_spiel()
{
    chark assasine = {"", "Assasine", 1,  8, 3, 10, 6 };
    chark *pa = &assasine;
    chark krieger  = {"", "Krieger",  1, 10, 8,  3, 6 };
    chark *pk = &krieger;
    chark jaeger   = {"", "Jaeger",   1,  3, 8, 10, 6 };
    chark *pj = &jaeger;
    char cname[30];
    int cklasse;
    system("cls"); 
    printf("\t\tWillkommen in der World of Wtfcraft!\n");
    printf("\t\t   Bitte Geben Sie Ihren Namen an: \n\t\t\t\t");
    scanf("%s", &cname);
    system("cls");
    printf("\t\tBitte geben Sie Ihre gewuenschte Charakterklasse an:\n\n");
    printf("\t\t\t\tAssasine (1)\n");
    printf("\t\t\t\tKrieger  (2)\n");
    printf("\t\t\t\tJaeger   (3)\n\t\t\t\t\t  ");
    scanf("%d", &cklasse);
    if (cklasse == 1)
    {
           //Assasine
           strcpy(assasine.name, cname);
           spielemenue(pa);
           
    } else if (cklasse == 2)
    {
           //Krieger
           strcpy(krieger.name, cname);
           spielemenue(pk);
           
    } else if (cklasse == 3)
    {
           //Jaeger
           strcpy(jaeger.name, cname);
           spielemenue(pj);
           
    } else {
          printf("Falsche Eingabe");
          system("pause");
          neues_spiel();
    }
}
.
.
.
int spielemenue(chark pointer)
{
    int auswahl = 0;
    system("cls");
    printf("\t\t\tKaempfen   (1)\n");
    printf("\t\t\tTrainieren (2)\n");
    printf("\t\t\tErholen    (3)\n");
    printf("\t\t\tShop       (4)\n");
    printf("\t\t\tCharakter  (5)\n");
    printf("\t\t\tBeenden    (6)\n\t\t\t\t    ");
    
    scanf("%d", &auswahl);
    switch(auswahl)
    {
                   case 1: 
                        kaempfen();
                   break;
                   
                   case 2:
                        trainieren();
                   break;
                   
                   case 3:
                        erholen();
                   break;
                   
                   case 4:
                        shop();
                   break;
                   
                   case 5:
                        //charakter();
                   break;
                   
                   case 6:
                        beenden();
                   break;
    }
}
Wenn ich das ganze mit Dev-C++ (Version 4.9.9.2) compilieren will. bekomm ich nur folgende Fehlermeldungen:
Code:
  [Linker error] undefined reference to `spielemenue(chark*)' 
  [Linker error] undefined reference to `spielemenue(chark*)' 
  [Linker error] undefined reference to `spielemenue(chark*)' 
  ld returned 1 exit status
Was ich bisher zu dem Problem bei Google gefunden habe ist, dass meist irgendwelche externen Dateien nicht richtig durch den Linker eingebunden werden. Da ich aber weder auf externe Dateien zugreife (ausgenommen die header) und mich auch nicht mit dem Linker von Dev-C++ auskenne, bin ich jetzt etwas aufgeschmissen und auf Hilfe angewiesen.
Der Compiler Log schmeißt dies noch aus:
Code:
g++.exe "C:\Users\******\Downloads\main(3).cpp" -o "C:\Users\******\Downloads\main(3).exe"    -I"C:\Programme\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Programme\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Programme\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Programme\Dev-Cpp\include\c++\3.4.2"  -I"C:\Programme\Dev-Cpp\include"   -L"C:\Programme\Dev-Cpp\lib"

Danke schonmal für eure Tipps

0wnZ
 
Zuletzt bearbeitet:
Am Anfang wo du die Funktion spielmenue deklarierst, sagst du, dass sie einen chark*, also einen Pointer auf dein Struct bekommt und verwendest dies auch so in der Funktion neues_spiel. Unten bei der Implementierung sagst du aber, dass die Funktion ein chark als Übergabe bekommt. An der Stelle überlädst du die Funktion und Implementierst damit nicht das, was du wohl eigentlich vor hattest. Somit findet der Compiler nur eine Deklaration der Funktion und wirft diesen Fehler.
 
Danke schön :)
Das war das Problem. Ich musste nur noch ein * bei dem Argument in spielemenue machen.
Hab wohl vor lauter Bäumen den Wald nicht mehr gesehen.
Danke nochmal ! :)

0wnZ
 
Kleine Anmerkung zum Code:
In neues_spiel() kannst du statt den if's beser ein switch verwenden. Stiltechnisch sauberer und bringt Geschwindigkeitsvorteile. :)
 
Theoretisch ja, praktisch sollte man sich man den Zwischencode ansehen, vermutlich hat der gcc das daraus schon gemacht. Bin immer wieder erstaunt, was der so alles optimieren kann.
 
Zurück
Oben