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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.