mikrocontroller.net

Forum: Compiler & IDEs Problem mit switch case (Anfänger!)


Autor: jabber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wie oben geschrieben habe ich ein Problem mit der switch Funktion.
Ich wollte nur schnell ein kleinens LCD Menü machen aber irgendwie 
bekomme ich das nicht hin.

hier erst mal der Code.
 
switch (menutap)
{    
   case 1 : 
      if(tast == DOWN)
         {LCD_puts("down",1);
          menutap = 2;
          }
       else if(tast == UP)
       {LCD_puts("up",1);
             }
       else 
      {LCD_puts("Case 1",1);
      }
   break;

   case 2:
       if(tast == DOWN)
         {LCD_puts("down",1);
          menutap = 3;
          }
       else if(tast == UP)
       {LCD_puts("up",1);
              menutap = 1;
                   }
       else 
      {LCD_puts("Case 2",1);
      }
     break;
  
    default : 
    menutap = 1;
    //LCD_puts("defaul",1);
    break;
  


Also eigentlich ganz einfach dachte ich. Aber es geht nicht. Warum? 
Welchen Fehler mache ich?
Die Taster sind über den Timer0 entprellt. Das funktioniert auch alles, 
wenn ich ein Taste drücke  wird die bezeichung der Taste auf dem LCD 
angezeit. Also wird der code ja durchlaufen, ausgeführt und die menutap 
müsste geändert werden. Aber er springt nicht ins ander Case um. Er 
bleibt immer in Case 1. Wenn ich menutap einen Wert gebe er in den Case 
und bleibt da.

Ich mache bestimmt so ein ganz doofen Anfängerfehler, oder?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich menutap einen Wert gebe er in den Case
> und bleibt da.

Erwartest Du, daß ohne erneute Auswertung von "menutap" nach einer 
Zuweisung innerhalb eines case-Zweiges automatisch in eine andere 
gesprungen wird?

Das funktioniert so nicht. Die Auswertung erfolgt genau einmal, danach 
wird der zugehörige case-Zweig angesprungen und ausgeführt. Eine 
Veränderung von "menutap" hat hier keinerlei Auswirkung mehr.

Damit sich das anders verhält, musst Du das ganze in eine Schleife 
packen (while/do..while) und erneut "menutap" auswerten.

Autor: jabber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber die Funktion wird doch ständig neu aufgerufen und die menutap 
ausgewertet. Dann springt er in den Case, führt den Code aus und ändert 
den menutap. Dann ist er fertig und die Funktion wird verlassen. Beim 
nächsten durchlauf müsste doch menutap einen andern wert haben und er so 
auch in ein anderes Case springen.

Oder bin ich jetzt total auf den Holzweg?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du menutap als globale oder lokale Variable definiert?

Autor: jabber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eine lokale Variable. Sie wird ja auch nur in der Funktion genutzt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die Variable lokal definiert hast und die Funktion verlässt 
verliert menutap (der Speciher wird wieder freigegeben) den vorher 
zugewiessenen Wert.

Autor: jabber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, vielen Danke! Es läuft zwar noch nicht richtig aber das bekomme 
ich jetzt hin, hoffe ich. Danke schön.

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.