for Schleife beenden



  • Hallo,

    ich habe in meinem Programm 3 for Schleifen. In der inneren (3.) möchte ich, wenn eine Bedingung erfüllt ist, den Code zum beenden aller Schleifen einsetzen. Mit Break beendet man nur immer die aktuelle Schleife. goto Befehle werden von C++ Programmierer ungern gesehehen. Wie kann ich das erreichen.

    Gruß Siegfried



  • Hallo

    in so einem Fall ist es am besten, die For-Schleifen in eine extra Funktion mit passenden Parametern zu packen, und dort dann einfach mit return die Funktion und damit die Schleifen zu verlassen



  • Ich würde es mit einer BOOL-Variable machen.

    bool b=true;
    for(...)//1.
    {
      for(...)//2.
      {
        for(...)//3.
        {
           if(...)
           {
             b = false;
             break;
            }
        }//3.
    
        if(b==false)
         break;
      }//2.
    
      if(b==false)
        break;
    }//1.
    

    oder so ähnlich...



  • *couchzurechtrück*
    *popcornhol*

    SCNR



  • @akari:
    funktionsaufrufe bringen nur unnötigen overhead.

    @beppo und epsilon
    ihr scheint wohl nicht zu wissen, wie for funktioniert.

    bool Stop = false;
    
    for (int i = 0; !Stop && i < 10; ++i)
    {
      for (int j = 0; !Stop && j < 10; ++j)
      {
        for (int k = 0; k < 10; ++k)
        { 
          // abbruch wenn k = 5
          if (k == 5)
          {
            Stop = true;
            break;
          }
        }
      }
    }
    


  • Sunday schrieb:

    @beppo und epsilon
    ihr scheint wohl nicht zu wissen, wie for funktioniert.

    bool Stop = false;

    for (int i = 0; !Stop && i < 10; ++i)
    {
    .

    Tatsächlich.
    Wieder was dazu gelernt.
    Danke!



  • Sunday schrieb:

    @akari:
    funktionsaufrufe bringen nur unnötigen overhead.

    Nicht wenn die Funktion geinlined wird.

    bis bald
    akari



  • Hallo,

    gebe zu, das diese Version mir nicht bekannt war.

    Für die Info's aller, vielen Dank.

    Gruß Siegfried 👍 👍 👍



  • @akari
    Das mit dem inline wird dir hier auch nichts helfen da der Compiler (zumindest der BCB) Funktionen die for enthlten nicht inline machen wird. Siehe auch Warnung W8027



  • Hallo Sunday

    funktionsaufrufe bringen nur unnötigen overhead.

    @beppo und epsilon
    ihr scheint wohl nicht zu wissen, wie for funktioniert.

    ein tolle Overheadversion hast Du da vorgeschlagen. Deine Stopprüfung findet exakt x * y * z mal statt. Was glaubst Du ist schneller und braucht weniger Code, ein Prozeduraufruf oder dein Stopptest 😕

    Gruß rudiS



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Und hier der verpönte Klassiker, der aber optisch am klarsten zeigt was passieren soll.

    Bei der guten Lösung

    for (int i = 0; !Stop && i < 10; ++i)
    

    muß aber dennoch meistens ziemlich lange suchen, da meistens noch zusätzlicher Code in der Schleifen steht, um festzustellen, das hier aus 3 Schleifen ausgestigen werden soll.

    Die Funktionsaufrufmethode, die nur dazu dient ein goto zu umgehen und brav dem Dogma zu gehorchen ist ja wohl abzulehnen

    Dies ist einer der wenigen Fälle, an denen ich wegen der Klarheit eine goto akzeptiere,

    bool b=true;
    for(...)//1.
    {
      for(...)//2.
      {
        for(...)//3.
        {
           if(...)
           {
             b = false;
             goto EndOfLoops;
            }
        }//3.
        if(b==false)
         break;
      }//2.
      if(b==false)
        break;
    }//1.
    EndOfLoops:
    


  • Sunday schrieb:

    @akari:
    funktionsaufrufe bringen nur unnötigen overhead.

    Die Codes die unter dieser Prämisse optimiert werden, möchte ich nicht warten müssen.
    Bevor man sowas nötig hat sollte man besser sein Gesamtkonzept und die verwendeten
    Algorithmen überprüfen, das bringt in 99% aller Fälle mehr als solche "Korinthen-Kackereien".

    Obige Aussagen gelten natürlich nur für ein professionelles Umfeld. Für einen
    "quick-and-dirty" Hack kann jeder tun was er will sofern das Ergebnis stimmt.



  • @Redhead

    Mann kann sachen aus wissentlich mißverstehen. Es ging hier um die Aussage, mehrere Schleifen direkt zu verlassen. um in der äußeren Schleife die Abfrage auf die break Bedingung zu vermeiden wollte man aus dem Teil ein Unterfunktion machen nach dem Motto "if (rc!=fktcall()) break", das ist wirklich Overhead.
    Da ist Sunday´s Version um Klassen besser.

    Mit inlining kann man auch nicht Quatsch den man durch unnötige, sinnlose Funktionsaufrufe künstlich erzeugt, wieder aushebeln.



  • PAD schrieb:

    @Redhead
    if (rc!=fktcall()) break

    Davon war war auch gar keine Rede. Vielleicht solltest du dir den angegebenen
    Vorschlag nochmals durchlesen. 🙄



  • Sorry redhead, dieser Vorschlag kam am Anfang von Akari



  • Nur damit es auch noch da steht:

    try
    	{
    		for(int i=0; i<10; ++i)
    		{
    			for(int j=0; j<10; ++j)
    			{
    				for(int k=0; k<10; ++k)
    				{
    					if(a[i][j][k] == 0)
    						throw;
    				}
    			}
    		}
    	}
    	catch(...) { }
    

    Das würde ich verwenden wenn der Abruch wirklich eine Ausnahme ist. Auf solche verschachtelten Konstruktionen kann man aber imo meistens verzichten...



  • Hm, ich weis zwar jetzt nicht, ob das ISO-Konform ist, aber warum nicht einfach die bereits vorhandenen Bedingungen zu einem Wiederspruch führen:

    for (int i = 0; i < 10; ++i)
    {
      for (int j = 0; j < 10; ++j)
      {
        for (int k = 0; k < 10; ++k)
        {
          // abbruch wenn k = 5
          if (k == 5)
          {
            i = 10;
            j = 10;
            break;
          }
        }
      }
    }
    


  • MFK schrieb:

    *couchzurechtrück*
    *popcornhol*

    Ist noch ein Platz frei? 😃
    Hat eigentlich mal jemand gezählt, wie oft wir dieses Thema schon durchgekaut haben? 🙄



  • @Fireflow

    Schreibt man goto´s in C++ so kompliziert?

    Ich hoffe für mich ist auch noch ein Platz auf der Couch


Anmelden zum Antworten