Problem mit Defaultparameter...



  • Hallo!
    Ich arbeite mich gerad durch ein C++ Einstiegsbuch durch, wo auch Übungsaufgaben zu lösen sind. Die Aufgabe an der ich hänge lautet ein Fakultätsprogramm mit rekursivem Algorythmus zu schreiben. Das Problem liegt nicht in der Idee zur Lösung der Aufgabe, sondern an dem Defaultparameter, den ich in der Funktion "fakult" habe. Vorher Deklariere ich ja den Prototyp der Funktion "fakult", damit ich die funktion auch unter die main-Methode stellen kann.
    Bei folgendem Code erhalte ich folgende Fehlermeldung:

    #include <iostream>
    int fakult(int , int erg = 1);
    
    void main() {
    int n;
    cout << "Fakultaetsprogramm mit rekursivem Algorythmus." << endl << endl;
    cout << "Eingabe(n):\t";
    cin >> n;
    cout << "Fakultaet n = " << fakult(n);
    }
    
    int fakult(int n, int erg=1) {    // Line 12
    if(n>0) {
    	erg *= n;
    	return fakult((n-1), erg); // stimmt, war ein dummer fehler(behoben)
    	}
    else return erg;
    }
    

    Fehlermeldung: Error learncpp13.cpp 12: Default argument value redeclared for parameter 'erg'

    Die Fehlermeldung verstehe ich auch: Es findet eine Redeklaration von des Defaultparameters "erg" statt. Aber sobald ich das int vor dem erg wegnehme(in der tatsächlichen Funktion) kommt diese

    Fehlermeldung: Error learncpp13.cpp 12: Type name expected

    Wie kann ich nun damit umgehen, ohne dass ich die Funktion vor die Mainfunktion setze und den die Deklaration des Prototyps weglasse?



  • Bebbo Erbse schrieb:

    Fehlermeldung: Error learncpp13.cpp 12: Default argument value redeclared for parameter 'erg'

    Die Fehlermeldung verstehe ich auch: Es findet eine Redeklaration von des Defaultparameters "erg" statt. Aber sobald ich das int vor dem erg wegnehme(in der tatsächlichen Funktion) kommt diese

    Nicht ganz - du redeklarierst den Defaultwert von erg. Lass einfach das "=1" weg...
    ETA: dto für deinen Selbstaufruf von fakult: gib einfach den Wert an den du übergeben willst oder lass ihn ganz weg (um den Defaultwert zu nehmen).



  • Achso, vielen Dank, das klappt auch!
    Nur noch eine Frage zum Verständnis: Wenn ich einer Variablen einen Wert zuweiese ist das doch eine Initialisierung, oder?
    Heißt das, im Falle einer Wertzuweisung bei einem Defaultparameter in der Funktionsignatur nennt man das Wertdeklaration?



  • Bebbo Erbse schrieb:

    Nur noch eine Frage zum Verständnis: Wenn ich einer Variablen einen Wert zuweiese ist das doch eine Initialisierung, oder?

    Sofern du dies bei der Deklaration bzw. Definition der Variablen machst, ja. Bei Defaultparameter bedeutet dies folgendes:

    The default argument expression has the same semantic constraints as the initializer expression in a declaration of a variable of the parameter type, using the copy-initialization semantics

    Bebbo Erbse schrieb:

    Heißt das, im Falle einer Wertzuweisung bei einem Defaultparameter in der Funktionsignatur nennt man das Wertdeklaration?

    Nicht dass ich ich wüsste. Man spricht halt einfach von 8.3.6 Default arguments. ➡ ISO/IEC 14882:2003(E)



  • Ich frage mich, wozu du überhaupt den Default-Parameter benötigst. Du gibst das ERbegnis doch per return zurück (und dank Wert-Übergabe kannst du über den Parameter nichts zurückschicken).


Anmelden zum Antworten