mikrocontroller.net

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


Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
if (checkbit(GPIOR2,GPIOR07))
case 0x55:
display_cursor(1,1);
display_string("Bit ist 1"); 
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.

Autor: Matthias (ein neuer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein. Die Anderen Case-Opfer müssen davon verschont bleiben...

Autor: Der Fönig (zotos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
case 0x55:
  if (checkbit(GPIOR2,GPIOR07))
  {
    display_cursor(1,1);
    display_string("Bit ist 1"); 
  }
break;


Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tex (Gast)
Datum:

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

Autor: Matthias (ein neuer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann so wie MArkus gepostet hat...

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (ein neuer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: tex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
switch (bla)
{
  case 0x??:
   break;

  /*alle anderen cases*/

  case 0x55:
   if(/*deine abfrage*/)
   {
     /*deine anweisungen*/
   }
   /*KEIN break damit er in default übergeht*/
  default:
   /*dein default*/
}

funktioniert so nur bei einem case so wie es soll.


pumpkin

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, break vergessen in der if abfrage.

switch (bla)
{
  case 0x??:
   break;

  /*alle anderen cases*/

  case 0x55:
   if(/*deine abfrage*/)
   {
     /*deine anweisungen*/
     break;
   }
   /*KEIN break damit er in default übergeht*/
  default:
   /*dein default*/
}


pumpkin

Autor: Matthias (ein neuer) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte auch gehen ;-)

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
switch(val)
{
  if (checkbit(GPIOR2,GPIOR07))
  {
    case 0x55:
      display_cursor(1,1);
      display_string("Bit ist 1");
      break;
  } /* if(checkbit... */

  default:
    break;
} /* 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.



Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.