mikrocontroller.net

Forum: Compiler & IDEs Programm hängt sich dauernd auf


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schreibe ein Programm mit Menüstruktur, doch leider hängt es sich 
immer auf. Hier mal ansatzweise meine Funktion:

void hauptmenu()
{
hautpmenu_screen:
//Hauptmenü zeichnen
//Auf Tastendruck warten

if ( PINA&(0b10000000)) {position++;      //Taste:Pfeil hoch gedrückt
                             goto hautpmenu_screen;
              }
if ( PINA&(0b01000000)) {position--;      //Taste:Pfeil runter gedrückt
                                             goto hautpmenu_screen;
                }
}

Nach einigen Tastendrücken hängt sich das Programm immer auf. Warum? 
Wenn ich den Gotobefehl außerhalb der if-Bedingung mache läuft das 
Programm. Darf ein Goto Befehl nicht von einer if-bedingung nach außen 
Springen?
Ich weis Goto Befehle sollte man nach Möglichkeit umgehen, es bietet 
sich aber gerade bei Menüstrukturen gut an.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht, wie Du Deine Menüstruktur insgesamt implementiert hast, 
aber goto ist in vielen Fällen ein Garant dafür, dass ein Programm sich 
aufhängt. goto macht einen der wichtigsten Vorteile der Hochsprache, 
nämlich den der strukturierten Programmierung, zunichte. Wenn man es 
benutzt, muss man GANZ GENAU wissen, was man da macht. Ich habe bisher 
keine Menüführung gesehen, die mit goto arbeitet. Wenn Du mit 
Sprungmarken und goto arbeiten willst, solltest Du besser in Assembler 
programmieren.

Abgesehen davon ist Deine Tasterabfrage mehr als fragwürdig. Bei sowas 
wie oben kann alles Mögliche passieren. Da Du nur einen Codeschnipsel 
hergibst, kann man dazu auch nicht mehr sagen.

Kleiner Tip: Schau mal hier durchs Forum, da gibts ne ganze Reihe von 
Beispielen für Menüs ohne goto. Sowas löst man i.d.R. mit 
Strukturvariablen, die in Abhängigkeit von gedrückten Tasten o.ä. 
geladen werden. Da brauchts kein goto.

Großer Tip: Schick beim nächsten mal mehr Code. Aus so einem Schnipsel 
kann man nix rauslesen (Und wenn Du tatsächlich mehr Code schicken 
solltest, dann bitte als Attachment und nicht im Editorfenster!)

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht so, finde ich sehr übersichtlich:

void hauptmenu()
{

while ( true )
{
  //Hauptmenü zeichnen
  //Auf Tastendruck warten

  if ( PINA&(0b10000000))
    position++;
  else if ( PINA&(0b01000000))
    position--;      //Taste:Pfeil runter gedrückt
}

}

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht so?

#define KEY_0 0x00
#define KEY_1 0x01
....
#define MENU_MAIN 0x80
#define MENU_OPTIONS 0x81
...
void ProcessMenu(char cKey)
{
 switch(cKey)
  {
   case KEY_1:
     switch(ActiveScreen)
      {
       case MAIN_MENU:
         ..
       break;
       default:
         // invalid Menuitem!!
      }
   case KEY_2:
    ....
   break;
   default:
    // invalid Keycode
  }
}

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.