Funktion mit Default-Parametern



  • long gcd(long op1 = abs(op1), long op2 = abs(op2))
    

    Warum ist es nicht möglich, die Parameter mit ihrem Betrag zu initialisieren?
    Ich will verhindern, dass die Funktion mit zwei negativen Werten aufgerufen wird. Bleibt mir als einziger Ausweg, dass ich in der Funktion zwei weitere Variablen anlege und mit den Beträgen initialisiere ? Es muss doch eine Möglichkeit geben, dass die Operanden mit ihrem Betrag initialisiert werden!?



  • Die Lösung für Dein Problem hast Du ja schon selbst gefunden. Nun dazu warum es nicht möglich ist: Weil es nicht nötig ist. Es geht anders (wie Du schon selbst bemerkt hast).



  • Gibt's eventuell irgendwo eine Bruch-Rechen-Library?
    Kampf dem Rundungsfehler! Nie wieder double!
    Thx für Tipp oder womöglich gar Link!



  • Naja zum einen kannst du dort keinen Standard Parameter verwenden so wie du es vorhast.
    Ein Standard Parameter ist dazu da das du net immer nen Alle Parameter
    angeben musst.Nen Bsp

    //Deklaration der funktion mit dem Standard Parameter
         void test(int a=2);
         //Aufruf der Funktion mit dem Standard Parameter
    
           test();
    

    Was ich dir damit sagen will ist das du ner Funktion mit Standard Paramter zwar
    Werte übergeben kannst aber das da dann der Standard Parameter net mehr greift
    greift.Sprich deine Übergeben nen Werte können dann nicht mit sich selber absolut geformt werde.Weil der Standard Parameter nur so lange gilt bis halt nen eigenen wert gegen ihn Ersetze;)

    Und du brauchst ja net mal 2 Variablen.
    Du schreibst in der Funktion:

    op1 = (op1<0)?-op1:op1;
         op2 = (op2<0)?-op1:op2;
    


  • fxdapokalypse schrieb:

    Naja zum einen kannst du dort keinen Standard Parameter verwenden so wie du es vorhast.
    Ein Standard Parameter ist dazu da das du net immer nen Alle Parameter
    angeben musst.Nen Bsp

    //Deklaration der funktion mit dem Standard Parameter
         void test(int a=2);
         //Aufruf der Funktion mit dem Standard Parameter
    
           test();
    

    Was ich dir damit sagen will ist das du ner Funktion mit Standard Paramter zwar
    Werte übergeben kannst aber das da dann der Standard Parameter net mehr greift
    greift.Sprich deine Übergeben nen Werte können dann nicht mit sich selber absolut geformt werde.Weil der Standard Parameter nur so lange gilt bis halt nen eigenen wert gegen ihn Ersetze;)

    Und du brauchst ja net mal 2 Variablen.
    Du schreibst in der Funktion:

    op1 = (op1<0)?-op1:op1;
         op2 = (op2<0)?-op1:op2;
    

    Super! Ich war mir nicht sicher, ob ich die Parameter im Funktionsrumpf so ohne weiteres manipulieren darf. Thx!
    Ich find's etwas ärgerlich, dass die Maschine z.T. einfache Additionen nicht hinbekommt, aus 3 + 0.4 berechnet sie mitunter = 3.40000001 und ähnlichen Unfug. Was kann man dagegen machen? Da hilft doch bestimmt nur eine Bruch-Rechen-Library weiter? Also falls die Leute, die sich C++ ausgedacht haben, wieder einmal ein paar neue Features dazu nehmen sollten, sollten sie unbedingt einen Datentyp für Bruchzahlen einführen. Sonst bekommt man mit double und float haufenweise falsche Ergebnisse heraus, teilweise kommen gar so krasse Dinge vor wie (4.2 - 4.1) != 0.1 Ein Alptraum.



  • Das Problem besteht nun mal bei Fliesskommazahlen. Deshalb sollte man diese auch nicht auf Gleichheit überprüfen, sondern einen Toleranzbereich wählen.
    Brüche haben dafür andere Nachteile.

    Dazu gibts übrigens massenhaft Themen in unserem Forum.


Log in to reply