Suche nach besserer Lösung



  • Ich denke, er meint, dass ein Operator sich abhängig von einer Variable wie + oder - verhalten soll. Man könnte mit Templates und std::plus bzw. std::minus etwas basteln, aber einfacher wäre wohl sowas:

    Q = Q_test; 
    Q_test = Q_test + (StepSize/100) * Q_test * (2*(J<J_ref) - 1);
    

    Oder verständlicher:

    Q = Q_test;  
    Q_test = Q_test + (StepSize/100) * Q_test * (J<J_ref ? +1 : -1);
    


  • ich glaube wir haben uns nicht ganz verstanden.
    Es geht nur darum das ich zeilen sparren wollte.

    Es müsste so aussehen:

    Es ist nur ein Code ausschnitt. Da hier der Unterschied lediglich das Vorzeichen ist wollte ich das ganze anders lösen. lg

    if(eingabe = max) \\Berechnung eines Maximus
    
    if(J<J_ref)
    {
    J_ref = J;
    Q = Q_test;
    Q_test = Q_test +(StepSize/100)*Q_test;
    }
    else
    {
    Q_test = Q;
    Q_test = Q_test - (StepSize/100)*Q_test;
    } 
    
    else // Berechnung eines Min
    
    if(J<J_ref)
    {
    J_ref = J;
    Q = Q_test;
    Q_test = Q_test -(StepSize/100)*Q_test;
    }
    else
    {
    Q_test = Q;
    Q_test = Q_test + (StepSize/100)*Q_test;
    }
    


  • Das Prinzip ist doch aus meinem Post ersichtlich. Es auf die konkrete Bedingung anzuwenden ist deine Aufgabe. Oder wo liegt das Problem?



  • ich verstehe deinen code nicht, könntest du es mir etwas genauer erklären. Bin kein Profi im Programmieren. lg



  • Wichtig ist eigentlich nur dieser Teil:

    resultat = a + b * (bedingung ? +1 : -1);
    

    Den ?: -Operator kennst du? Der ist wie ein kompaktes if , also im Prinzip so:

    if (bedingung)
        resultat = a + b * (+1);
    else
        resultat = a + b * (-1);
    

    Und das ist das Gleiche wie:

    if (bedingung)
        resultat = a + b;
    else
        resultat = a - b;
    

    Also habe ich das Ganze kompakter geschrieben und Codeduplizierung vermieden. Übrigens macht der folgende Code dasselbe (du musst dir überlegen, dass true dem Wert 1 und false dem Wert 0 entspricht, also ist 2*1 - 1 == 1 und 2*0 - 1 == -1 ):

    resultat = a + b * (2*bedingung - 1);
    


  • wuw jetzt habe ich es verstanden. Sehr gut durchdacht.

    Hmm dann habe ich noch ne kleine Frage.

    Wenn ich Angenommen nur die Bedingung ändern möchte. Um genau nur das < oder > wie würdest du da rangehen.

    Würdest du dieses Zeichen mit ASCII in einer variablen speichern und diese dann übergeben ?


  • Mod

    juri23 schrieb:

    wuw jetzt habe ich es verstanden. Sehr gut durchdacht.

    Hmm dann habe ich noch ne kleine Frage.

    Wenn ich Angenommen nur die Bedingung ändern möchte. Um genau nur das < oder > wie würdest du da rangehen.

    Würdest du dieses Zeichen mit ASCII in einer variablen speichern und diese dann übergeben ?

    Du kannst Operatoren nicht in Textform übergeben. Wenn man beliebige Operatoren an eine funktion übergeben will, macht man das mit Funktionszeigern. Aber da es hier nur um den Austausch von < und > geht, macht man das auch mit einem Vorfaktor, denn a<b ist äquivalent zu -a>=b.



  • bei der zweiten Variante hatte ich leider probleme mit dem Ergebnis.
    bei
    (J<J_ref) kamen nicht die selben Ergebnisse raus wie bei (-J>J_ref)

    Deswegen versuche ich es gerade mit deinem anderen Vorschlag.
    würde es so aussehen ?

    //Hat man sich für ein Minimum entschieden
    *funktion = & bool operator<(X const& J, X const& J_ref);
    //Hat man sich für ein Maximum entschieden
    *funktion = & bool operator>(X const& J, X const& J_ref);

    ((Außerdem ist es ein Problem das X bedeutet das ich diesen Operator nur als Klassenmethoden überladen kann und ich nicht mit Klassen arbeite ?))

    if(funktion==true)
    ....

    😕 😕



  • ist diese Frage so dumm ? das Problem kann doch nicht so schwer sein ? Aber ich komme einfach nicht drauf. 😞


  • Mod

    juri23 schrieb:

    ist diese Frage so dumm ? das Problem kann doch nicht so schwer sein ? Aber ich komme einfach nicht drauf. 😞

    Ich glaube eher der allgemeine Eindruck ist, dass deine Fragen bereits beantwortet wurden.



  • SeppJ schrieb:

    denn a<b ist äquivalent zu -a>=b.

    Nein (betrachte a=2, b=3).

    Aber

    a < b;  // *(-1)
    -a > -b;
    

    Oder

    a < b;
    b > a;
    

    juri23 schrieb:

    das Problem kann doch nicht so schwer sein ?

    Du kannst natürlich einen Funktionszeiger speichern, das war auch, was ich mit "Templates und std::plus bzw. std::minus " gemeint habe. Ich fürchte jedoch, das geht etwas zu weit für dich. Abgesehen davon ist es gar nicht nötig.

    Mit einer der beiden oben gezeigten Beziehungen solltest du es nun wirklich schaffen, denselben Operator für mehrere Fälle anzuwenden.


  • Mod

    Nexus schrieb:

    SeppJ schrieb:

    denn a<b ist äquivalent zu -a>=b.

    Nein (Gegenbeispiel a=2, b=3).

    Aber

    a < b;  // *(-1)
    -a > -b;
    

    Ups, wie peinlich.



  • @SeppJ

    au jetzt sehe ich es auch...sry das war echt peinlich. Jap das ist die beste Lösung.

    Noch mal danke an alle 🙂 👍 👍 👍 👍


Anmelden zum Antworten