Parameter Problem. "bezeichner nicht definiert" obwohl in der Klasse vorhanden. -= gelöst =-



  • Nein, war eher als scherz gemeint, allerdings verstehe ich nicht ganz wieso. Auch nicht die C strings, das ist doch nicht gesund. 😃

    Aber egal. was ich sagen will, selbst nachdem du ihn verbessert hast - das war (und ist (?)) Müll.
    Man müsste das Grundgerüst neu überdenken.



  • Hacker schrieb:

    Auch nicht die C strings, das ist doch nicht gesund. 😃

    Altes Märchen.
    Die sind hier angemessener als std::string, sie werden ja nicht irgendwie "verarbeitet".



  • Vor allem wird hier die Allokation und das ganze Drumherum von std::string gespart. Die strings können somit direkt vom Compiler so wie sie da stehen in den Code eingefügt werden. Ich würde allerdings den Zeiger auch noch const machen.



  • 314159265358979 schrieb:

    Ich würde allerdings den Zeiger auch noch const machen.

    Ach, ich Deppchen. Ich habe überall const vergessen, zum Beispiel

    void aDreieck() {
        double const h=eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an.");
        double const g=eingabeDouble("Bitte geben Sie nun noch die Grundseite des Dreiecks an.");
        double const aDreieck = g*h/2;
        cout << "Die Formel lautet g * h : 2\n";
        cout << "Die Flaeche des Dreiecks lautet daher: " << aDreieck << '\n';
    }
    


  • Mal ne Frage: was macht es für einen Sinn, den Wert Konstant zu machen, wenn es völlig ersichtlich ist, dass er nicht mehr verändert wird 😕
    Und könnte man 'g*h/2' nicht gleich in den Ausgabe-Stream schreiben ?
    Oder auch sowas:

    void aDreieck() 
    {
        double aDreieck =
        eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an.")*
        eingabeDouble("Bitte geben sie nun noch die Hoehe des Dreiecks an.")/2;
        cout << "Die Formel lautet g * h : 2\n"
                 "Die Flaeche des Dreiecks lautet daher: " << aDreieck << '\n';
    }
    

    Edit: hab grad die Antwort gesehen. Passt nicht 🙄



  • Hacker schrieb:

    Und könnte man 'g*h/2' nicht gleich in den Ausgabe-Stream schreiben ?

    Ja nein.
    Ich mag die extrem hochkomplizierte mathematische Berechnung in einer eigenen Zeile haben, um das Programm zu entwirren.



  • Hacker schrieb:

    Mal ne Frage: was macht es für einen Sinn, den Wert Konstant zu machen, wenn es völlig ersichtlich ist, dass er nicht mehr verändert wird 😕

    Ok, dann mache ich das const halt wieder weg.
    Aber jetzt weiß ich nicht, wieviel const überleben soll. Also bei Compilezeitkonstenten wie HAUPTMENU, ENDE und ANZAHL maxchen wir bestimmt ein const.
    Und wo lassen wir es weg? PI, welchen Zeiger meintest Du? Und soll der wirklich const sein oder nicht? Nach welcher Regelung?



  • Hacker schrieb:

    double aDreieck =
        eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an.")*
        eingabeDouble("Bitte geben sie nun noch die Hoehe des Dreiecks an.")/2;
    

    Nein, so etwas bitte nicht. Die Reihenfolge der Funktionsaufrufe ist undefiniert. Wenn sie das sein soll, braucht es mindestens eine Zwischenvariable.



  • Aber

    double aDreieck =
        eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an.")*
        eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an.")/2;
    

    wäre spaßig, weil es zufällig nicht falsch wird.



  • @volkard: consts lassen, was nicht verändert werden muss, ist const 😉

    char const* const namen[ANZAHL] = { ... };
    

    Die Funktionszeiger würde ich instinktiv auch const machen, aber wo das const da hin soll, weiß ich nicht.



  • const char* const namen[ANZAHL] = { ... };
    

    oder 🤡



  • void(*const funktionen[ANZAHL])()=
    

    würde ein versehentliches

    funktionen[3]=&aKreis;
    

    verhindern.



  • Arbeitet der Compiler nicht von Links nach rechts ?
    Müssten die Funktionen in meinem Beispiel nicht nacheinander aufgerufen werden und nicht zufällig ? Oder ist das Compilerspezifisch ? 😕



  • 314159265358979 schrieb:

    @volkard: consts lassen, was nicht verändert werden muss, ist const 😉

    Also ich glaube fast, die Profis hauen nicht so viel const rein.



  • Hacker schrieb:

    Arbeitet der Compiler nicht von Links nach rechts ?
    Müssten die Funktionen in meinem Beispiel nicht nacheinander aufgerufen werden und nicht zufällig ? Oder ist das Compilerspezifisch ? 😕

    Ist compilerspezifisch.
    Deine rechet von links nach rechts, also

    double aDreieck =
        eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an.")*
        eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an.")/2;
    

    Grundseite voe Höhe.

    Und ruft von rechts nach links Funktionsargumente auf, also

    double aDreieck =
        mul(eingabeDouble("Bitte geben Sie die Grundseite des Dreiecks an."),
           eingabeDouble("Bitte geben sie die Hoehe des Dreiecks an."))
        /2;
    

    Höhe vor Grundseite.

    Nehme ich mal an. Könnte aber auch anders sein.



  • Hacker schrieb:

    const char* const namen[ANZAHL] = { ... };
    

    oder 🤡

    Nein,

    char const* const namen[ANZAHL] = { ... };
    

    (Deins geht zwar auch, finde ich aber unhübsch.)



  • volkard schrieb:

    Also ich glaube fast, die Profis hauen nicht so viel const rein.

    Das weiß ich nicht. Besser ein const zu viel als eines zu wenig.



  • volkard schrieb:

    314159265358979 schrieb:

    @volkard: consts lassen, was nicht verändert werden muss, ist const 😉

    Also ich glaube fast, die Profis hauen nicht so viel const rein.

    Musst du wissen, du bist doch hier der Guru 😉



  • Hacker schrieb:

    Musst du wissen, du bist doch hier der Guru 😉

    Ich glaube auch Gurus kein Wort, wenn sie keine Begründung anbringen können.



  • Ich bin zwar kein Guru, aber aus Prinzip mache ich so viel const wie möglich und sinnvoll. Das vermeidet Fehler. Zugegebenermaßen habe ich noch nie einen Fehler durch ungewolltes verändern einer lokalen Variable gehabt, aber mit const kann ich diese Intention direkter ausdrücken. Das hat eher syntaktischen Wert für mich.


Anmelden zum Antworten