break und continue
-
Hallo zusammen,
ich habe eine kurze Frage zu "break" und "continue". Wenn ich möchte, dass mein Programm nach einem Ereignis unterbrochen
wird, so dachte ich schreibe ich einfach break und an anderer Stelle continue. Wenn ich jedoch einfach break in eine ButtonClick - Methode
schreibe, dann kommt folgende Fehlermeldung:[C++ Fehler] Calculations.cpp(124): E2030 break-Anweisung an ungültiger Position
Meine Frage ist, wann ich break wie setzen kann. Es muss doch möglich sein ein Programm an belieber Stelle zu unterbrechen!
Vielen Dank für eure Hilfe
lg, freakC++
-
Dann hast du den Sinn von break und continue noch nicht verstanden.
Diese zwei Schlüsselwörter können nur in Schleifen verwendet werden, bzw. break auch noch in einem switch.
int i=0; while(true){ if(++i == 10) break; // Sobald i 10 ist, Schleife verlassen } i = 0; while(i < 10){ if(++i % 2 == 0) continue; // Jedes mal wenn i durch 2 teilbar ist, den Schleifendurchgang überspringen // Ansonsten hier etwas machen... // ... } i = 0; // Außerdem kann man break auch noch in einem switch verwenden // Hier sorgt break dafür dass kein "Fallthrough" ensteht, obwohl das manchmal auch mit Absicht verursacht wird switch(i){ case 0: // do something break; case 1: // do something else break; }
-
Um es zusätzlich zu dem Quelltext mal in Worte zu fassen.
Wenn Du ein "break" in eine Schleife setzt, wird an dieser Stelle die Schleife komplett abgebrochen, egal wie lange sie noch gelaufen wäre.
Wenn Du ein "continue" in eine Schleufe setzt, dann wird der aktuelle Schleifendurchgang abgebrochen und sofort mit dem nächsten Schleifendurchgang weitergemacht.
Nun an einem Beispiel:
Du hast ein Array mit 50 Feldern (alles Integerwerte).
Alle 50 Felder sind mit einer 9 gefüllt, dies soll einen ungültigen Wert darstellen. Der Reihe nach wird das Array mit Werten von 1 bis 6 gefüllt.
Nun willst Du an einer Programmstelle die Werte in dem Array überprüfen.
Sobald die Zahl 1 bis 5 hinterlegt ist, willst Du damit irgendwas machen.
Die Zahl 6 willst Du ignorieren. Sobald die Zahl 9 auftaucht, weisst Du, kann in den weiteren Feldern dahinter keine gültige Zahl mehr kommen.for(i=0; i<=49; i++) { if(array[i] == 9) break; if(array[i] == 6) continue; else { // irgendwas mit der Zahl machen } }
Nun nehmen wir die zweite Einsatzmöglichkeit von break: in einer Switch-Anweisung. Bleiben wir bei dem Beispiel, Du willst mit jeder Zahl 1 bis 5 etwas anderes machen, je nach Wert soll eine andere, vorher festgelegte Zahl hinzuaddiert werden.
ACHTUNG: zunächst falscher Code!
for(i=0; i<=49; i++) { if(array[i] == 9) break; if(array[i] == 6) continue; switch(i) { case 1: array[i] += 17; case 2: array[i] += 54; case 3: array[i] += 33; case 4: array[i] += 74; case 5: array[i] += 6; } }
Dieser Code würde dazu führen, das ab dem Eintreffen der ersten Bedingung, alle weiteren Bedingungen mit abgearbeitet werden.
Also in Deinem Arrayfeld liegt die Zahl 2.
Es würde zuerst die 54 hinzuaddiert, dann die 33, dann die 74 und zuletzt die 6.
Je nach Programm und Ziel kann das sinnvoll sein und wird auch dann absichtlich so programmiert. Wenn Du das nicht willst, was in der Regel der Fall sein dürfte, dann muss jede Case-Anweisung mit einem break abgeschlossen werden:for(i=0; i<=49; i++) { if(array[i] == 9) break; if(array[i] == 6) continue; switch(i) { case 1: array[i] += 17; break; case 2: array[i] += 54; break; case 3: array[i] += 33; break; case 4: array[i] += 74; break; case 5: array[i] += 6; } }
Das "break" in der letzten Zeile kannst Du Dir sparen, denn da ist ja eh das Ende der Möglichkeiten erreicht. Es passiert aber auch nix, wenn Du es (aus Macht der Gewohnheit) trotzdem setzt.
Üblicherweise wird als letzte Bedingung einer switch-Anweisung noch ein default-Case gesetzt. Damit kann gesteuert werden, was passieren soll, wenn überhaupt keine der vorgenannten Bedingungen zutrifft.
switch(i) { case 1: array[i] += 17; break; case 2: array[i] += 54; break; case 3: array[i] += 33; break; case 4: array[i] += 74; break; case 5: array[i] += 6; break; default: array[i] *= array[i]; }
Ich hoffe break und continue ist etwas deutlicher geworden.
Was aber vermutlich Dein ursprüngliches Problem nicht löst.Wo, wie, warum willst Du denn Dein Programm unterbrechen, was soll danach passieren? Erzähl ein wenig mehr, dann wird Dir sicherlich auch dafür eine Lösung angeboten.
-
Hallo,
vielen Dank für die super ausführliche Erklärung. Ich hatte tatsächlich die Bedeutung von break und continue falsch verstanden! Nun ist es aber klar!Eine Frage bleibt aber noch, die jedoch nichts mit dem eigentlichen Thema zu tun hat. Kannst du mir sagen, was dein default machen würde. Ich habe nämlich die Wel der Pointer leider nich nicht vollständig durchblickt und verstehe diese Zeile noch nicht! (wird sich aber ändern
:D)
Vielen Dank für eure Hilfe
lg freakC++PS. Wie kann ich denn dann mein Programm an einer beliebigen Stelle stoppen??
PPS: Ich sehe gerade, dass es sich glaub ich um gar keinen Pointer handelt. Ich glaube ich habes es verstanden^^
-
freakC++ schrieb:
Eine Frage bleibt aber noch, die jedoch nichts mit dem eigentlichen Thema zu tun hat. Kannst du mir sagen, was dein default machen würde.
Default in einem Switch ist soetwas wie else{} in einer Schleife
-
halloei schrieb:
Default in einem Switch ist soetwas wie else{} in einer Schleife
Ich glaub es war mehr der Ausdruck
array[i] *= array[i];
der ihn verwirrt hat.
Dieser steht eigentlich für nichts anderes wie
array[i] = array[i] * array[i];
demnach ist der * Operator hier nur für eine Multiplikation verwendet, hat also nichts mit Pointern zu tun.
-
Huch, ist schon spät
-
ja, das habe ich im Nachhinein auch gemerkt, aber wie halloei schion gesagt hat....es war schon spät!!
Nun ja, ich habe mich noch mal umgeschaut, aber ich habe leider im großen Internet keine antwort auf mein "ps" gefunden. Daher bin ich nochmals auf euch angewiesen.
Vielen Dank
lg, freakC++
-
Hallo,
ich muss nochmal eine Frage stellen, die sich auf den Beitrag von JustSomeCode bezieht. Er hat folgenden Quelltext gepostet, den
ich jedoch noch ein bisschen erweitert habe:int i= 0; while(i < 10){ if(++i % 2 == 0) continue; ShowMessage(i); }
Ich habe mal den Quelltext aufgefröselt: i startet in der If- Bedingung mit 1. Somit ergibt sich folgende Liste:
1 --> Rest nicht 0 -> ShowMessage
2 --> Abbruch
3 --> Rest nicht 0 -> ShowMessage
4 --> Abbruch
5 --> Rest nicht 0 -> ShowMessage
6 --> Abbruch
7 --> Rest nicht 0 -> ShowMessage
8 --> Abbruch
9 --> Rest nicht 0 -> ShowMessage
10 --> AbbruchEs werden also alle ungeraden Zahlen gezeigt. Das ist soweit auch alles logisch und verständlich. Nun habe ich aber den Quelltext
ein bisschen geändertint i= 0; while(i < 10){ if(i++ % 2 == 0) continue; //das inkrement steht nun hinter i ShowMessage(i); }
Nun startet i mit 0. Somit ergab sich für mich folgende Liste:
0 --> Abbruch
1 --> Rest nicht 0 -> ShowMessage
2 --> Abbruch
3 --> Rest nicht 0 -> ShowMessage
4 --> Abbruch
5 --> Rest nicht 0 -> ShowMessage
6 --> Abbruch
7 --> Rest nicht 0 -> ShowMessage
8 --> Abbruch
9 --> Rest nicht 0 -> ShowMessage
10 --> AbbruchDiese Liste stimmt aber nicht. Es werden nun nämlich alle geraden Zahlen gezeigt. Ich verstehe nicht warum. Wenn eine gerade
Zahl gezeigt wird, bedeutet es doch, dass die if Bedingung nich wahr war (sonst wäre continue ausgelöst worden)!!! Die
if-Bedingung muss aber wahr gewesen sein, da ein rest ungleich 0 ensteht wenn ich eine ungerade Zahl durch 2 teile!!Wo liegt mein Denkfehler???
Vielen Dank für eure Hilfe
lg, freakC++
-
Nunja genau das ist eben der Effekt des Postinkrements.
int i = 1; if(i++ == 1){ // Dieser Vergleich ergibt true, da zur Auswertungszeit i noch gleich 1 ist printf("%d", i); // Dennoch wird hier 2 ausgegeben, nicht 1, da nach Auswertung des Ausdrucks i inkrementiert wurde }
Das Postinkrement (i++) sorgt dafür, dass erst NACH Auswertung des Ausdrucks inkrementiert wird.
Das Präinkrement (++i) hingegen inkrementiert sofort, also schon VOR Auswertung des Ausdrucks.
Wenn du also trotz Postinkrement alle ungeraden Zahlen ausgeben willst, müsstest du immer i-1 ausgeben.
int i = 0; while(i < 10){ if(i++ % 2 == 0) continue; // Erst vergleichen, dann inkrementieren ShowMessage(i-1); // i ist jetzt um 1 höher als es zum Zeitpunkt des Vergleichs war, deshalb zur Ausgabe 1 subtrahieren }
-
Hi,
danke!! Nun habe ich es endlich kapiert. Man hätte es natürlich auch so schreiben können:while(i < 10){ if(++i % 2 != 0) continue; ShowMessage(i); }
Die letzte Frage: Wie breche ich mein Programm an beliebiger Stelle ab?
Vielen Dnak
lg, freakC++
-
Du kannst innerhalb von Funktionen jederzeit returnen, selbst wenn es void Funktionen sind.
void doSomething() { int i = 1; // Etwas machen... if(i == 1) return; // Wenn i dann immernoch 1 ist, Funktion abbrechen; Da die Funktion vom Typ void ist wird kein Wert returned, sondern return steht alleine // Ansonsten ganz normal weitermachen... }
Wenn du dein Programm beenden willst, brauchst du eigentlich nur in deiner main() Funktion returnen.
int main() { int i = 1; // Wieder etwas machen... if(i == 1) return 1; // Wenn i dann immernoch 1 ist, Programm beenden; Hier in diesem Beispiel mit dem Fehler code 1 // Anderenfalls ganz normal weiter machen return 0; // Hier wäre dann das normale Programmende; da alles gut gegangen ist returnen wir 0 }
-
freakC++ schrieb:
Die letzte Frage: Wie breche ich mein Programm an beliebiger Stelle ab?
Hallo freakC++,
beantwortet der letzte Beitrag von JustSomeCode Deine Frage?
Ich hatte bei Deinem Anfangspost den Eindruck, als ob Du beim Eintreffen eines Ereignisses an dieser Programmstelle unterbrechen und zu einer anderen Stelle im Programm springen willst, oder habe ich Dich da missverstanden?Sonst poste doch mal ggf. Deinen Code und sag, was an welcher Stelle passieren soll.