Probleme mit Funktionen und Linker



  • Moin Moin lieben C Programmierer,

    vorweg, ich bin programmieranfänger und beschäftige mich momentan aufgrund meines Studiums mit c.
    Mir wurde die Aufgabe erteilt einen einfach Taschenrechner zu programmieren, der Funktionen und switch/case enthält. Das Problem ist, dass mir der Compiler immer diese Fehlermeldung ausgibt:

    In function operatorWahl()': [Linker error] W:/.../Taschenrechner.cpp:51: undefined reference toberechnungplus()'
    [Linker error] W:/.../Taschenrechner.cpp:52: undefined reference to berechnungminus()' [Linker error] W:/.../Taschenrechner.cpp:53: undefined reference toberechnungmal()'
    [Linker error] W:/.../Taschenrechner.cpp:54: undefined reference to `berechnunggeteilt()'
    W:\...\collect2.exe [Error] ld returned 1 exit status

    Ich habe schon im internet nachgeforscht und dort wurde geschrieben, dass der Linker nicht weiß, wo er die Funktionen findet. "Ich müsste sie also nur includieren...." Aber ich hab doch nur eine Datei, in der auch die Funktionen enthalten sind. Probiere jetzt schon eine ganze weile herum, finde aber diesen Fehler nicht.... 😡

    Wäre nett wenn jmd herausfinden würde, wo der Fehler im Programm liegt
    Ich bedanke mich jetzt schon mal für jeden Ratschlag 🙂

    /******************************************************
    ***    Name                                         ***
    ***    Datum 9.9.2014                               ***
    ***    Dateiname Taschenrechner.cpp                 ***
    ***    Bezeichnung:  Taschenrechner                 ***
    *******************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    
    float eingabeZahlen(void);
    void operatorWahl(void);
    float berechnungplus(void);
    float berechnungminus(void);
    float berechnungmal(void);
    float berechnunggeteilt(void);
    
    int main (void)
    {
    
    	printf("Taschrechner v1.0\n\n\n");
    
    	eingabeZahlen();
    
    	operatorWahl();
    
    	return (0);
    }
    
    float eingabeZahlen()
    {
    	float zahl1 = 0;
    	float zahl2 = 0;
    
    	printf("Geben Sie 2 Zahlen ein, mit denen Sie rechnen wollen!\n\n");
    	printf("1.Zahl: ");
    	scanf("%g", &zahl1);
    	printf("\n2.Zahl: ");
    	scanf("%g", &zahl2);
    
    	return(zahl1, zahl2);
    }
    void operatorWahl(void)
    {
    	char ch;
    
    	printf("\n\nGeben sie den Rechenoperator ( + - / * ), den Sie verwenden moechten: ");
    	scanf("%c", &ch);
    
    	switch(ch)
    	{
    		case '+': berechnungplus(); break;
    		case '-': berechnungminus(); break;
    		case '*': berechnungmal(); break;
    		case '/': berechnunggeteilt(); break;
    		default: printf("\n\nKeinen gueltigen Operator gewählt!!!!"); operatorWahl(); 
    	}
    }
    float berechnungplus(float zahl1, float zahl2)
    {
    	float Ergebnis = 0;
    	Ergebnis = zahl1 + zahl2;
    	return (Ergebnis); 
    }
    float berechnungminus(float zahl1, float zahl2)
    {
    	float Ergebnis = 0;
    	Ergebnis = zahl1 - zahl2;
    	return(Ergebnis);
    }
    float berechnungmal(float zahl1, float zahl2)
    {
    	float Ergebnis = 0;
    	Ergebnis = zahl1 * zahl2;
    	return(Ergebnis);
    }
    float berechnunggeteilt(float zahl1, float zahl2)
    {
    	float Ergebnis = 0;
    	if((zahl1 == 0) || (zahl2 == 0))
    	{
    		printf("Es darf nicht durch 0 geteilt werden!!!");
    		eingabeZahlen();
    	}
    	else
    	{
    		Ergebnis = zahl1 / zahl2;
    		return(Ergebnis);
    	}
    }
    


  • Die Signatur der von dir deklarierten und aufgerufenen Funktionen stimmt nicht mit der Signatur der definierten Funktionen überein. Das sollte eigentlich nicht zu einer derartigen Fehlermeldung führen, weil der Linker die Signatur gar nicht kennt. Du benutzt wahrscheinlich einen C++-Compiler.

    Es ist aber um so mehr falsch. Dein Programm zeigt allerdings, dass das nicht einfach ein Fehler ist, sondern dass du den Sinn von Funktionsparametern und Funktionsrückgabewerten überhaupt nicht verstanden hast. Anscheinend schreibst du einfach irgendwas hin und hoffst auf gut Glück, dass es funktioniert. Du solltest das Kapitel über Funktionen dringend nochmal von vorne lesen.



  • Ich danke dir zunächstmal für die schnelle Antwort.

    Grundsätzlich habe ich den Aufbau von Funktionen verstanden. Leider habe ich noch Probleme damit diese richtig anzuwenden. Deshalb werde ich mich nochmal intensiv damit beschäftigen und mit den Funktionen herumprobieren.

    Momentan benutze ich den DEV-C++ Compiler.



  • blixnet1 schrieb:

    Grundsätzlich habe ich den Aufbau von Funktionen verstanden. Leider habe ich noch Probleme damit diese richtig anzuwenden.

    Also doch nicht richtig verstanden.

    Allgemein: Funktionen bekommen Werte übergeben, machen etwas damit und geben einen Wert zürück.
    Die Übergabewerte müssen beim Aufruf angegeben werden.
    Der Rückgabewert muss nicht benutzt werden.

    Daraus kannst du folgern, dass dein Programm so nicht funktionieren kann.

    (Es gibt auch Fälle, wo kein Wert übergeben wird oder/und kein Wert zurückgegeben wird. Das hängt von der Funktion ab)

    blixnet1 schrieb:

    Momentan benutze ich den DEV-C++ Compiler.

    DEV-C++ ist eine Entwicklungsumgeben.
    Allerdings gabs da mal eine Entwicklungspause von 6 Jahren.
    Der Nachfolger heißt mittlerweile auch anders.
    Schau doch mal nach, welche Version du hast, damit du sicher bist, auch die neuste Version zu haben. Als Einstieg: http://de.wikipedia.org/wiki/Orwell_Dev-C%2B%2B



  • blixnet1 schrieb:

    Momentan benutze ich den DEV-C++ Compiler.

    Ich meinte, dass dein Compiler anscheinend im C++-Modus arbeitet. Die meisten C++-Compiler haben auch einen C-Modus. Wenn du C lernen willst, solltest du herausfinden, wie du deinen Compiler zu einem C-Compiler machst. Es könnte z.B. helfen, wenn du deine Dateien .c statt .cpp nennst.


Log in to reply