Forum: Compiler & IDEs "case" Anweisung mit zusätzlichem "if"


von tex (Gast)


Lesenswert?

Hallo Leute
ich hatte die verwegene Idee, meine Case-Anweisung um eine weitere 
Bedingung zu erweitern.
Der Compiler meckert nicht und das Programm funktioniert auch soweit, 
mit Außnahme der if-Anweisung. Die wird offenbar ignoriert.
1
if (checkbit(GPIOR2,GPIOR07))
2
case 0x55:
3
display_cursor(1,1);
4
display_string("Bit ist 1"); 
5
break;

Gibt es einen anderen Weg die case-Anweisung zu sperren?
Hintergrund. Ich möchte am Ende noch die default-Anweisung nutzen, wenn 
die Anweisung wegen des nicht gesetzten GPIOR07 nicht abgearbeitet 
werden konnte.

von Matthias (ein neuer) (Gast)


Lesenswert?

Vielleicht etwa so:

if (checkbit(GPIOR2,GPIOR07))
{
  switch ( irgendeine_variable )
  {
    case 0x55:                       // wenn: irgendeine_variable = 0x55
        display_cursor(1,1);
        display_string("Bit ist 1");
        break;
    case 0x11:                       // wenn: irgendeine_variable = 0x11
        // statements
        break;
  }
}
else
{
  // statements, if needed
}

von tex (Gast)


Lesenswert?

Nein. Die Anderen Case-Opfer müssen davon verschont bleiben...

von Der F. (zotos)


Lesenswert?

1
case 0x55:
2
  if (checkbit(GPIOR2,GPIOR07))
3
  {
4
    display_cursor(1,1);
5
    display_string("Bit ist 1"); 
6
  }
7
break;

von A.K. (Gast)


Lesenswert?

Das "if" wird nicht wirklich ignoriert, aber um das ganze zu verstehen 
sollte man sich die case labels als äquivalent to goto labels 
vorstellen.

Die bekanntest Form solcher Spässe ist 
http://de.wikipedia.org/wiki/Duff's_Device.

von tex (Gast)


Lesenswert?

@markus
In dieser Weise würde das if zwar funktionieren, aber das default eben 
nicht
 mehr, weil das case 0x55 ja abgearbeitet wurde.

von Matthias (ein neuer) (Gast)


Lesenswert?

Dann so wie MArkus gepostet hat...

von tex (Gast)


Lesenswert?

Ich habs mal auf der untersten Ebene versucht aber eine Case Anweisung 
muss eben constant sein. Na gut, schreib ich eben die Default-Anweisung 
um, dann geht es auch.

von Matthias (ein neuer) (Gast)


Lesenswert?

Und was ist, wenn du zu dem if (checkbit... noch ein else mit den 
default anweisungen hinzufügst?

case 0x55:
   if (...)
   {
     ....
   }
   else
   {
     // hier nochmal default anweisungen
   }
   break;
case ...



default:


}  // switch ende

von tex (Gast)


Lesenswert?

@ Matthias
Ja, so etwas in der Art habe ich jetzt gemacht, nur das die Default/Else 
- Anweisung jetzt eine eigene Sub-Routine geworden ist.
Gute Nacht Euch allen

von pumpkin (Gast)


Lesenswert?

wozu soll er die default-routine abarbeiten wenn er auf einen gültigen 
case trifft? default macht er nur wenn kein case getroffen wurde. mein 
vorschlag:
1
switch (bla)
2
{
3
  case 0x??:
4
   break;
5
6
  /*alle anderen cases*/
7
8
  case 0x55:
9
   if(/*deine abfrage*/)
10
   {
11
     /*deine anweisungen*/
12
   }
13
   /*KEIN break damit er in default übergeht*/
14
  default:
15
   /*dein default*/
16
}

funktioniert so nur bei einem case so wie es soll.


pumpkin

von pumpkin (Gast)


Lesenswert?

ups, break vergessen in der if abfrage.

1
switch (bla)
2
{
3
  case 0x??:
4
   break;
5
6
  /*alle anderen cases*/
7
8
  case 0x55:
9
   if(/*deine abfrage*/)
10
   {
11
     /*deine anweisungen*/
12
     break;
13
   }
14
   /*KEIN break damit er in default übergeht*/
15
  default:
16
   /*dein default*/
17
}


pumpkin

von Matthias (ein neuer) (Gast)


Lesenswert?

Sollte auch gehen ;-)

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Um bei tex' Version zu bleiben:
Keine Ahnung, ob das Funktioniert und genau das macht, was er will (weil 
ich es nicht getestet habe), aber weshalb seine Version "nicht 
Funktioniert", ist, dass er nur das 'case-label' (also nur die eine 
Zeile nach dem if) im Programm aktiv hat, wenn das Bit gesetzt ist. 
Möglicherweise wollte er ja folgendes:
1
switch(val)
2
{
3
  if (checkbit(GPIOR2,GPIOR07))
4
  {
5
    case 0x55:
6
      display_cursor(1,1);
7
      display_string("Bit ist 1");
8
      break;
9
  } /* if(checkbit... */
10
11
  default:
12
    break;
13
} /* switch(val) */

Aber wie gesagt: möglicherweise übersehe ich da am frühen Morgen auch 
noch ein paar Details und ich hab's nicht getestet.
Die Kommentare an den Klammerpaaren habe ich mal zum Verständnis 
hinzugefügt.



von pumpkin (Gast)


Lesenswert?

nein, so funktioniert das leider nicht. in diesem fall wird er das if 
nie anfassen da er immer einen JMP zum case macht. und der erwünschte 
effekt, dass er defaultet auf grund der bedingung, tritt auch nicht ein.

is noch früh  ;)


pumpkin

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.