Veröffentlicht 7. November 200222 j Hallo, ich habe zwei ineinander geschachtelte for-Schleifen. Mit break kann ich die innerste Schleife verlassen if(wert ==75) break; Wie mache ich das aber, wenn ich nicht nur aus der innersten Schleife, sondern aus beiden raus will?! Technician
7. November 200222 j continue; ist Dein Freund MSDN: The continue statement forces immediate transfer of control to the loop-continuation statement of the smallest enclosing loop. (The “loop-continuation†is the statement that contains the controlling expression for the loop.)
7. November 200222 j Hi, du könntest z.B. ein LAbel setzen und mit goto dahinspringen, das ist aber kein sauberer Programmierstil. Ne etwas umständlichere Methode wäre: bool r=false; for (int i=0; i<20; i++) { for (int j=0; j<35; j++) { if (i==12 && j==21) { r=true; break; } if (r) break; } } [/PHP] Gruß Guybrush
7. November 200222 j Also wie man es Hochschulen lernt, so ist auch ein break ein sehr unsauberes Mittel. Dann stimmt schon was in der Konzeption nicht. Eine Schleife ist ein Konstrukt mit einer Abbruchbedingung. Einfach "mal so" rauszuspringen erschwert die Wartung des Codes. Ausserdem lässt mit breaks keine Verifizierung durchführen.
7. November 200222 j Originally posted by Guybrush Threepwood ...snip... Ne etwas umständlichere Methode wäre: bool r=false; for (int i=0; i<20; i++) { for (int j=0; j<35; j++) { if (i==12 && j==21) { r=true; break; } if (r) break; } } [/PHP] Gruß Guybrush [/b] Das würde ich persönlich aber auf jedem Fall der Verwendung von GoTo vorziehen. Goto verwende ich eigentlich nur in RPG aber niemals in C++. Goto ist und bleibt unsaubere Programmierung.
7. November 200222 j Das würde ich persönlich aber auf jedem Fall der Verwendung von GoTo vorziehen. Goto verwende ich eigentlich nur in RPG aber niemals in C++. Goto ist und bleibt unsaubere Programmierung. Dem muß ich voll und ganz zustimmen.
7. November 200222 j Originally posted by gugelhupf Also wie man es Hochschulen lernt, so ist auch ein break ein sehr unsauberes Mittel. Dann stimmt schon was in der Konzeption nicht. Eine Schleife ist ein Konstrukt mit einer Abbruchbedingung. Einfach "mal so" rauszuspringen erschwert die Wartung des Codes. Ausserdem lässt mit breaks keine Verifizierung durchführen. Da gebe ich dir - teilweise - recht. Manchmal ist es aber unsauberer, alles in die Abbruchsbedingung zu packen. In diesem Fall erschwert es auch nicht die Wartung des Codes - hab's mir also sehr gut überlegt, ob ich da wirklich ein Break machen will oder nicht!
7. November 200222 j Originally posted by Doham Das würde ich persönlich aber auf jedem Fall der Verwendung von GoTo vorziehen. Goto verwende ich eigentlich nur in RPG aber niemals in C++. Goto ist und bleibt unsaubere Programmierung. Hab mich für die Methode mit dem Flag entschieden Ich dachte nur erst, es gäbe eine "eingebaute" Möglichkeit, so wie das break
7. November 200222 j Originally posted by Doham continue; ist Dein Freund hast du da nicht was verwechselt?! :confused:
7. November 200222 j C++ programmiere ich nur zuhause. Heut abend, guck ich mal in meinen quellcode, ob ich ne Lösung dazu finde. ähm, mit continue hast Du recht, in dem quellcodebeispiel der MSDN wird continue verwendet, um einen Teil der Schleife zu umgehen. Also wird die Schleife zwar nicht verlassen, aber der Funktionsteil (oder ein Teil davon) umgangen. Anscheinend hab ich heute Mittag den Hilfetext nicht richtig gelesen. Sorry... // Get a character that is a member of the zero-terminated // string, szLegalString. Return the index of the character // entered. int GetLegalChar( char *szLegalString ) { char *pch; do { char ch = _getch(); // Use strchr library function to determine if the // character read is in the string. If not, use the // continue statement to bypass the rest of the // statements in the loop. if( (pch = strchr( szLegalString, ch )) == NULL ) continue; // A character that was in the string szLegalString // was entered. Return its index. return (pch - szLegalString); // The continue statement transfers control to here. } while( 1 ); return 0; } [/PHP]
7. November 200222 j Ich will mich jetzt bestimmt nicht in die Diskussion einmischen, ob break nun gut oder böse ist, ob man hier goto nutzen kann oder ob die Flag-Lösung die allein seelig machende ist. Aber wie wäre es mit einer Exception? Ihr könnt goto verhindern, ihr könnt break verhindern und ein Flag braucht ihr auch nicht. (Leider wurde nicht dazugeschrieben ob in C oder C++ programmiert wird. In C gibt es natürlich keine Exceptions...) Das continue hier nicht hilft wurde ja zum Glück schon geklärt. HTH Jan
7. November 200222 j Hallo Jan! Originally posted by Orffi Aber wie wäre es mit einer Exception? Ihr könnt goto verhindern, ihr könnt break verhindern und ein Flag braucht ihr auch nicht. (Leider wurde nicht dazugeschrieben ob in C oder C++ programmiert wird. In C gibt es natürlich keine Exceptions...) Ist C++ Da das Verlassen der Schleife nur einmal gebraucht wird, und es sich auch nicht um eine Fehlerbehandlung handelt, ist hier eine Exception nicht sonderlich sinnvoll (denke ich). Der Quellcode ist ein bisschen zu viel, um ihn hier zu posten, aber es wird praktisch in der äußeren Schleife ein Vektor durchsucht; ist ein Element gefunden, wird noch ein anderer Vektor durchsucht (innere Schleife) und wenn auch hier das passende Element gefunden ist, werden beide Schleifen verlassen. Technician
7. November 200222 j ...und es sich auch nicht um eine Fehlerbehandlung handelt, ist hier eine Exception nicht sonderlich sinnvoll (denke ich). Wer sagt denn, daß man Exceptions nur bei der Fehlerbehandlung nutzen darf??? Jan
7. November 200222 j Hi, wenn ich nu auch noch meinen Senf dazugeben darf . Um bei oben erwähnten Beispiel zu bleiben: Originally posted by Guybrush Threepwood Hi, du könntest z.B. ein LAbel setzen und mit goto dahinspringen, das ist aber kein sauberer Programmierstil. Ne etwas umständlichere Methode wäre: for (int i=0; i<20; i++) { for (int j=0; j<35; j++) { if (i==12 && j==21) { j = 35; i = 20; } } } [/PHP] Gruß Guybrush [/b] Ich würd diese Variante auch vorziehen allerdings etwas weniger 'umständlich'. Warum sorgst du nicht einfach innerhalb der Schleifen dafür, das die Abbruchbedingung wahr wird? Im Klartext: Einfach in der Schleife 'j' den Wert 35 zuweisen und 'i' den Wert 20. Und #schwupps' sind beide Abbruchbedingungen wahr und die Schleifen werden verlassen. Das setzt natürlich voraus, das du weder den aktuellen Wert von 'i' noch den von 'j' nach der jeweiligen Schleife brauchst.
7. November 200222 j dafür werde ich jetzt sicher gesteinigt , da es nur bei ms geht: __try { for (...) for (...) if (...) __leave; } __finally { } [/PHP] wenn die bedingung erfüllt ist veranlasst das leave, dass das progrämmchen in den finally block springt.
7. November 200222 j Originally posted by Eight Hi, Ich würd diese Variante auch vorziehen allerdings etwas weniger 'umständlich'. Warum sorgst du nicht einfach innerhalb der Schleifen dafür, das die Abbruchbedingung wahr wird? Im Klartext: Einfach in der Schleife 'j' den Wert 35 zuweisen und 'i' den Wert 20. Und #schwupps' sind beide Abbruchbedingungen wahr und die Schleifen werden verlassen.Das ist IMHO gefährlich. Wenn dieser Code mal verändert werden muss, hat man da eine potentielle Fehlerquelle. Ich halte Exceptions oder goto für durchaus angebracht, wenn es die Les- und Wartbarkeit des Codes verbessert.
7. November 200222 j Man kann Exceptions ja auch als parallele Nachrichtenschleife zu der Message-Queue verwenden. Aber rein optisch als Fehlerbehandlung ist es am sinnigsten eingesetzt. Was ist denn wichtiger? Optisch straffer aber evtl. "gefährlicher" Code oder unübersichtliches Schleifenhandling. Jeder Code kann falsch programmiert gefährlich sein, deshalb finde ich das jedenfalls in diesem Fall auch absolut korrekt.
7. November 200222 j dafür werde ich jetzt sicher gesteinigt , da es nur bei ms geht: Du wirst von mir vielleicht nicht gesteinigt, aber darauf hingewiesen, daß man, wie ich schon weiter oben vorgeschlagen habe, dies auch mit ISO-C++ erreichen kann. Allerdings weiß ich nicht, wie daß __finally bei MS zu deuten ist. Ein finally wie in Java gibt es in C++ ja nicht. Wenn es also um Resourcenfreigabe geht, dann müßte man mit einem auto_ptr<> arbeiten. Ich halte Exceptions oder goto für durchaus angebracht, wenn es die Les- und Wartbarkeit des Codes verbessert. Schön, daß mein Lösungsvorschläge doch ernst genommen werden. Ich habe ja auch noch keine Antwort bekommen, wer sagt, daß man Exceptions nur bei Fehlern verwenden darf. Stroustrup selbst sagt, daß es auch Exceptions ohne Fehler geben darf. Wenn man mir schon nicht traut, vielleicht dem guten Herrn Stroustrup... Bis dann Jan
7. November 200222 j Originally posted by Orffi Allerdings weiß ich nicht, wie daß __finally bei MS zu deuten ist. der finally block wir auf jeden fall durchlaufen. nur kann man mit __leave direkt dahin springen.
8. November 200222 j Originally posted by Eight Das setzt natürlich voraus, das du weder den aktuellen Wert von 'i' noch den von 'j' nach der jeweiligen Schleife brauchst. ... und so ist es auch... ich brauche die Werte hinterher noch, da es sich nicht um bloßes "durchzählen" handelt
8. November 200222 j Originally posted by goepp dafür werde ich jetzt sicher gesteinigt , da es nur bei ms geht: __try { for (...) for (...) if (...) __leave; } __finally { } [/PHP] wenn die bedingung erfüllt ist veranlasst das leave, dass das progrämmchen in den finally block springt. [/b] ... scheidet leider aus - Programm soll auf Windows und UNIX laufen...
11. November 200222 j Also ich würde dafür ne Funktion schreiben: verkürzt: { for(i=0;i<max;i++){ . . for(ii=0;ii<max2;ii++){ . . . if(bFound) return } }
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.