Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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

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.

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.

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

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

Originally posted by Doham

continue; ist Dein Freund

hast du da nicht was verwechselt?! :confused:

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]

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

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

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

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.

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.

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.

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.

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

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.

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

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

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.