Anfängerfrage: variable was not declared in this scope



  • Hallo zusammen! Bin blutiger Anfänger in C++ und habe eine kleine Frage. Folgendes kleines Programm habe ich geschrieben. User wird zur Eingabe einer Zahl aufgefordert, die eingegebene Zahl wird in der Funktion ausrechnen() verdoppelt und ausgegeben.

    #include <iostream>
    
    int main()
    {
    	int zahl;
    	int ergebnis;
    
    	 std::cout << "Bitte Zahl eingeben!" << std::endl;
        std::cin >> zahl;
    
    	ergebnis = ausrechnen(zahl);
    	std::cout<<"Ergebnis: "<<ergebnis<<"\n";
    }
    
    int ausrechnen(int a)
    {
    	a = a * 2;
    	return a;
    }
    

    Beim Compilieren wird eine Fehlermeldung ausgeworfen:

    'ausrechnen' was not declared in this scope ergebnis = ausrechnen(zahl)

    Wenn ich nun den Code wie folgt umstelle und die beiden Funktionen miteinander vertausche, dass die Funktion ausrechnen() vor der Funktion main() steht, funktioniert es wie erwünscht:

    #include <iostream>
    
    int ausrechnen(int a)
    {
    	a = a * 2;
    	return a;
    }
    
    int main()
    {
    	int zahl;
    	int ergebnis;
    
    	 std::cout << "Bitte Zahl eingeben!" << std::endl;
        std::cin >> zahl;
    
    	ergebnis = ausrechnen(zahl);
    	std::cout<<"Ergebnis: "<<ergebnis<<"\n";
    }
    

    Ich dachte, C++ wäre "objektorientiert"? :p Kann mir jemand etwas näher erläutern, wieso es funktioniert, wenn ich die Funktionen im Quelltext umstelle?

    Vielen Dank schonmal im voraus! 😋



  • Der Compiler geht einmal durch den Code und kennt daher nur, was er schon gelesen hat.

    Im ersten Beispiel ist ihm eine Funktion namens ausrechnen in Zeile 11 noch nicht bekannt.

    Eine Lösung hast du gefunden.
    Eine Andere wäre, die Funktion durch eine Deklaration vorher bekannt zu machen:

    int ausrechnen(int a);
    

    (in Zeile 2)

    Mit Objektorientierung hat das aber nichts zu tun.



  • Danke schon mal! 👍

    Ich bin noch recht neu bei C++. Hatte bisher nur mit Visual Basic gecodet. Das rächt sich natürlich jetzt ein wenig, dass VB sehr großzügig mit dem Umgang von kleinen "Fehlern" ist.

    Wie mache ich das rein praktisch, wenn ich beispielsweise einen Quelltext mit Unmengen an Code und Funktionen habe, dass ich da den Überblick darüber behalte, was ich bereits deklariert haben und was nicht? Gibt es da eine empfohlene Vorgehensweise? Oder jage ich erstmal alles durch den Compiler und werte dann Fehler für Fehler einzeln aus?

    Edit: noch eine kurze Frage. Habe die Funktion so wie von dir vorgeschlagen direkt am Anfang deklariert.

    #include <iostream>
    
    int ausrechnen(int a);
    
    int main()
    {
    	int zahl;
    	int ergebnis;
    
    	 std::cout << "Bitte Zahl eingeben!" << std::endl;
        std::cin >> zahl;
    
    	ergebnis = ausrechnen(zahl);
    	std::cout<<"Ergebnis: "<<ergebnis<<"\n";
    }
    
    int ausrechnen(int a)
    {
    	a = a * 2;
    	return a;
    }
    

    Warum muss ich jetzt die Funktion selbst und die Variable a nochmal erneut jeweils mit int deklarieren? Warum kann ich das dann nicht einfach so schreiben:

    ausrechnen(a)
    {
    	a = a * 2;
    	return a;
    }
    


  • Dafür gibt es Headerdateien in denen du alles deklarierst so wie es dir DirkB bereits gezeigt hat.

    Antwort auf deinen editierten Beitrag:
    Im 2ten Teil handelt es sich um eine Definition nicht um eine Deklaration.
    C/C++ ist nicht ein Spielzeug für Kinder wie Basic.


  • Mod

    EOP schrieb:

    Im 2ten Teil handelt es sich um eine Definition nicht um eine Deklaration.

    Eine Definition ist eine Deklaration. (Ich weiß, was du meintest, aber du musst es auch so schreiben.)

    Warum muss ich jetzt die Funktion selbst und die Variable a nochmal erneut jeweils mit int deklarieren? Warum kann ich das dann nicht einfach so schreiben:

    Weil das unleserlicher Blödsinn ist, der nur zu Fehlern führt? Faustregel: So viel abkürzen zu wollen wie möglich ist extrem kontraproduktiv.



  • Eine Deklaration ist die Ankündigung einer Tat.
    Eine Definition ist die Tatbeschreibung.


Log in to reply