2 Variablen Abbruchkriterium in Schleife bis zum größeren laufen



  • Hi zusammen ich will nicht vor meiner schleife prüfen welcher Wert größer ist dann zuweisen und den Wert dann als Abruch-Kriterium das sollte doch auch in der Schleife gehen oder nicht?

    sprich wenn
    sizeTeile = 15
    sizeTests = 5

    dann soll er bis 15 laufen
    und wenn
    sizeTeile = 5
    sizeTests = 15
    auch bis 15

    Ich hatte es so probiert

    for (i = 0; i< sizeTeile||i< sizeTests; i+=2)
    

    aber is ja klar so kann es nicht gehen weil abbruch beim kleineren ist. Ich steh glaub grad aufm schlauch wie kann ich erst beim gößeren abrechen?



  • for(unsigned int i = 0; i < (( sizeTeile < sizeTests) ? sizeTests : sizeTeile); ++i)
    

    Caipi



  • WOW krieg ich dazu noch ne kleine Erklärung?
    für den Teil: i < (( sizeTeile < sizeTests) ? sizeTests : sizeTeile)

    Aber vielen Dank schon mal



  • Polofreak schrieb:

    WOW krieg ich dazu noch ne kleine Erklärung?
    für den Teil: i < (( sizeTeile < sizeTests) ? sizeTests : sizeTeile)

    Aber vielen Dank schon mal

    Aufgrund der äußeren Klammern wird der Ternäre Operator (?:) zuerst bewertet.
    Die Syntax des ?:-Operators ist:

    expression ? value1 : value2
    

    Wenn expression true ist wird value1 ausgewertet ansonsten value2. (Wobei du den ?:-Op auch verschachteln kannst).

    Auf das Beispiel bezogen prüft der ?:-Operator welche Variable kleiner ist und nimmt dementsprechend die größere, welche dann in dem mittleren Ausdruck der For-Schleife bewertet wird...

    /edit: code-tags...
    /edit3 🙂

    Caipi



  • Machs lieber so:

    #include <algorithm> //für std::max, liefert aus zwei Werten den größeren
    int sizeTeile = 5;
    int sizeTest = 15;
    
    for( int i = 0, end = std::max( sizeTeile, sizeTest ); i < end; ++i )
    

    Du willst nen Grund wissen? Ganz einfach so ist es schneller und sauberer 🙂



  • aber std macht bei mir immer probleme! warum ist es sauberer?
    Ich find das Klasse Lösung das einzigste was mich etwas stört ist das unsigned! Wenn jetzt getSize nen Fehler hat gibt sie -1 zurück, das bekomm ich jetzt aber gar nicht mit!
    Aber macht ja nichts!



  • Polofreak schrieb:

    aber std macht bei mir immer probleme! warum ist es sauberer?
    Ich find das Klasse Lösung das einzigste was mich etwas stört ist das unsigned! Wenn jetzt getSize nen Fehler hat gibt sie -1 zurück, das bekomm ich jetzt aber gar nicht mit!
    Aber macht ja nichts!

    Meinst du das unsigned aus der for-Schleife meines Posts?
    Wenn ja: Das kannst du natürlich auch weglassen 😕

    Caipi



  • Es ist sauberer weil du wann immer mölich die Standardbibliothek verwenden solltest. Das macht deinen Code robuster, da diese Funktionen ausgiebig getestet wurden und daher Bugfrei sind (sicher hat die ein oder andere Implementierung wo nen Bug, aber sowas lässt sich dann schnell rausfinden mit ner Suche bei google).
    Wenn du std::max verwendest kann es dir zB nicht passieren statt > < zu verwenden.

    Und inwiefern macht std bei dir Probleme?



  • ich weiß nicht ich hatte schon oft probleme und umgeh std wenn es irgendwie geht 😃

    ja ich meinte das unsigned in der Schleife, wenn ich das weglasse und es kommt ein negativer Wert, was macht dann die Schleife??



  • Wenn du das unsigned weglässt, dann läuft die Schleife vom negativen Wert bis zum Abbruchkriterium. Wenn der Wert positiv sein muss (wenn -1 nen Fehler ist) musst du die Werte vorher prüfen.

    Und wenn du kein std nehmen willst, dann mach es so

    for( int i = 0, end = sizeTeile > sizeTest ? sizeTeile : sizeTest; i < end; ++i );
    

    Sonst musst du die Abbruchbedingung ja nach jedem Schleifendurchgang neu berechnen.



  • Ich danke euch allen recht herzlich sieht schon mal ganz gut aus!

    Vielen Dank



  • Hallo,

    Hattest du deine erste Variante mal ausprobiert? Die geht nämlich.

    Ciao


Anmelden zum Antworten