Technician Geschrieben 7. November 2002 Geschrieben 7. November 2002 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 Zitieren
Doham Geschrieben 7. November 2002 Geschrieben 7. November 2002 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.) Zitieren
Guybrush Threepwood Geschrieben 7. November 2002 Geschrieben 7. November 2002 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 Zitieren
gugelhupf Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
Crush Geschrieben 7. November 2002 Geschrieben 7. November 2002 Mit Goto: Das ist der einzige sinnvolle Einsatz dieses Befehls! Zitieren
Doham Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
Guybrush Threepwood Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
Technician Geschrieben 7. November 2002 Autor Geschrieben 7. November 2002 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! Zitieren
Technician Geschrieben 7. November 2002 Autor Geschrieben 7. November 2002 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 Zitieren
Technician Geschrieben 7. November 2002 Autor Geschrieben 7. November 2002 Originally posted by Doham continue; ist Dein Freund hast du da nicht was verwechselt?! :confused: Zitieren
Doham Geschrieben 7. November 2002 Geschrieben 7. November 2002 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] Zitieren
Orffi Geschrieben 7. November 2002 Geschrieben 7. November 2002 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 Zitieren
Technician Geschrieben 7. November 2002 Autor Geschrieben 7. November 2002 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 Zitieren
Orffi Geschrieben 7. November 2002 Geschrieben 7. November 2002 ...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 Zitieren
Eight Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
goepp Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
Klotzkopp Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
Crush Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
Orffi Geschrieben 7. November 2002 Geschrieben 7. November 2002 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 Zitieren
goepp Geschrieben 7. November 2002 Geschrieben 7. November 2002 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. Zitieren
Technician Geschrieben 8. November 2002 Autor Geschrieben 8. November 2002 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 Zitieren
Technician Geschrieben 8. November 2002 Autor Geschrieben 8. November 2002 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... Zitieren
maxim_42 Geschrieben 11. November 2002 Geschrieben 11. November 2002 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 } } Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.