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.
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!)
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 } }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.