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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.