C >> break-Abbruchtiefe in case

OP #5360228
Lesenswert?

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?
#5360258
Lesenswert?

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 . . .
Persönliche Seite #5360390
Lesenswert?

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.
#5360402
Lesenswert?

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.
OP #5361222
Lesenswert?

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.
#5361433
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren