Forum: Mikrocontroller und Digitale Elektronik C >> break-Abbruchtiefe in case


von __Son´s B. (bersison)


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?

von Adam P. (adamap)


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

von __Son´s B. (bersison)


Lesenswert?

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

von Adam P. (adamap)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Adam P. (adamap)


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.

von __Son´s B. (bersison)


Lesenswert?

Nochmals DANKE für eure Anregungen - die Idee der Teilsimulation ist 
bestechend!

von Johnny B. (johnnyb)


Lesenswert?

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.

von __Son´s B. (bersison)


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.

von Peter D. (peda)


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
}

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
Noch kein Account? Hier anmelden.