Hallo.
Kurze Frage...bin mir innerhalb einer case-Anweisung nicht sicher, wie
weit ein "break"-Abbruch reicht.
Bsp:
----------------------
case 1:
while(PINB & (1<<PB2))
{
Funktion1();
EnergieBudget--;
if(EnergieBudget==0) break; //BREAK1
}
Funktion2();
break; //BREAK2
----------------------
Frage:
Wohin springt "BREAK1" - zur Funktion2(), oder direkt aus switch/case
raus?
Hey __Son´s Bersi__, das break bezieht sich auf die aktuelle "Ebene". Er springt nur aus der while()... das hättest du aber auch eben mal kurz alleine testen können :-P Kurzes Test-Programm:
1 | /******************************************************************************/
|
2 | void Funktion1(void) |
3 | {
|
4 | printf("Funktion1\n"); |
5 | }
|
6 | |
7 | /******************************************************************************/
|
8 | void Funktion2(void) |
9 | {
|
10 | printf("Funktion2\n"); |
11 | }
|
12 | |
13 | /******************************************************************************/
|
14 | int main() |
15 | {
|
16 | uint8_t x = 1; |
17 | uint32_t EnergieBudget = 3; |
18 | |
19 | switch (x) |
20 | {
|
21 | /**************************************/
|
22 | case 1: |
23 | {
|
24 | while (1) |
25 | {
|
26 | Funktion1(); |
27 | EnergieBudget--; |
28 | |
29 | if(EnergieBudget == 0) |
30 | {
|
31 | break; |
32 | }
|
33 | }
|
34 | |
35 | Funktion2(); |
36 | } break; |
37 | |
38 | /**************************************/
|
39 | case 2: |
40 | {
|
41 | printf("FOO\n"); |
42 | } break; |
43 | |
44 | /**************************************/
|
45 | default:
|
46 | { } break; |
47 | }
|
48 | |
49 | system("pause"); |
50 | return 0; |
51 | }
|
Ergibt folgende Ausgabe:
1 | Funktion1
|
2 | Funktion1
|
3 | Funktion1
|
4 | Funktion2
|
5 | Drücken Sie eine beliebige Taste . . . |
Vielen Dank für deine Hilfe! Adam P. schrieb: > mal kurz > alleine testen können :-P Dazu müsste ich erst einmal das gesamte Programm fertig programmieren und ins uC übertragen...
__Son´s B. schrieb: > Dazu müsste ich erst einmal das gesamte Programm fertig programmieren > und ins uC übertragen... Oder eben mal eine andere Entwicklungsumgebung (VisualStudio, Eclipse, CodeBlocks, gcc direkt, etc.) öffnen und ein kurzes Konsolenprogramm (Windows/Linux) schreiben - siehe oben.
Adam P. schrieb: > Oder eben mal eine andere Entwicklungsumgebung (VisualStudio, Eclipse, > CodeBlocks, gcc direkt, etc.) Es gibt sogar online-C-Compiler, die man aus dem Browser heraus verwenden kann. https://www.onlinegdb.com/online_c_compiler So etwas simuliert zwar keinen Microcontroller, aber den Programmablauf kann man z.B. mit printf & Co. sichtbar machen.
Rufus Τ. F. schrieb: > Es gibt sogar online-C-Compiler Oh ja stimmt :) die hatte ich ganz vergessen! Kann seine Vor- & Nachteile haben. Ich hab z.B. ein VisualStudio Projekt und da sind halt die Grunddinge schon hinterlegt, so dass ich nicht bei jedem Test immer bei 0 Anfangen muss. Und wenn man sich sogar noch die Hardware "simuliert/abstrahiert", dann könnte man (er) sogar sein µC Code 1 zu 1 kopieren und testen - man muss ja da nicht direkt alles implementieren, Stück für Stück, dass was grad gebraucht wird.
Nochmals DANKE für eure Anregungen - die Idee der Teilsimulation ist bestechend!
Vielleicht werde ich jetzt hier im Forum gesteinigt für diese Aussage, aber ich sage es trotzdem: Statt dem "break" kannst Du auch ein "goto" verwenden, dann ist auch klar wo Du hinspringst.
Adam P. schrieb: > Oder eben mal eine andere Entwicklungsumgebung (VisualStudio, Eclipse, > CodeBlocks, gcc direkt, etc.) öffnen und ein kurzes Konsolenprogramm > (Windows/Linux) schreiben - siehe oben "Code::Blocks" scheint einfach, schnell, kostenfrei - gefällt mir auf anhieb. Johnny B. schrieb: > Statt dem "break" kannst Du auch ein "goto" verwenden, dann ist auch > klar wo Du hinspringst. Tolles Werkzeug! Hatte ich zuerst verwendet, erscheint mir aber im Laufe des Programmcode zu unübersichtlich. Habe den if/break verschoben, so das das Prog eine "Ehrenrunde" durchläuft, aber sonst zuverlässig läuft.
Das break beendet die innerste Anweisung, die mit einem break beendet werden kann (do, while, for, switch). Manchmal will man aber aus einem geschachtelten Switch raus. Das geht z.B. so:
1 | uint8_t a, b, x, y, z; |
2 | |
3 | void test( void ) |
4 | {
|
5 | do{ |
6 | switch( a ){ |
7 | case 0: x++; break; // -> 2: |
8 | case 9: |
9 | switch( b ){ |
10 | case 0: y -=8; break; // -> 1: |
11 | case 3: z -= 3; continue; // -> 3: |
12 | case 8: y -= 7; return; // -> 4: |
13 | }
|
14 | // 1:
|
15 | x -= 2; |
16 | break; // -> 2: |
17 | }
|
18 | // 2:
|
19 | y >>= 1; |
20 | // 3:
|
21 | }while(0); |
22 | x += y; |
23 | // 4:
|
24 | }
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.