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


von Matthias (Gast)


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.

von johnny.m (Gast)


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!)

von Walter (Gast)


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
}

}

von Ronny (Gast)


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
  }
}

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.