Zum Inhalt springen

Verlassen geschachtelter For-Schleifen


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.)

Geschrieben

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

Geschrieben

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.

Geschrieben
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.

Geschrieben
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! ;)

Geschrieben
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 :)

Geschrieben

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]

Geschrieben

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

Geschrieben

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

Geschrieben
...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

Geschrieben

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.

Geschrieben

dafür werde ich jetzt sicher gesteinigt :D , 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.

Geschrieben
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.

Geschrieben

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.

Geschrieben
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

Geschrieben
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.

Geschrieben
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 :)

Geschrieben
Originally posted by goepp

dafür werde ich jetzt sicher gesteinigt :D , 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...

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...