Programm hängt sich dauernd auf

Gast #461442
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.
Gast #461706
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!)
Gast #462021
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
}

}
Gast #462028
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren