Problem mit dem Auslesen von Pfeiltasten
-
Wie du meinst.
-
der fehler liegt eindeutig in dieser passage da getch immer die 224 zurückgibt aber wie man das problem lösen kann weiss ich jetzt nicht
abfrage=_getch();
if(abfrage==224)
{
abfrage = _getch();//danach muss man des nochma machen weil dann der tastencode kommt
-
Unterfunktionen helfen erheblich. Das was du jetzt main nennst soll später ja ein Unterprogramm sein, das verbietet dir aber nicht auch unterfunktionen zu benutzen. Falls du Sorge haben solltest, das andere Untefunktionen benutzen und es zu namens problemen kommen kann hast du zwei möglichkeiten. Lass alle deine Funktionen mit einer eindeutigen Kennung beginnen im schlimmstenfalle mit
"Lyrix_" oder lass deinen SourceCode in einem File und erkläre alle Unterfunktionen als static, dann kann es außerhalb auch ncit zu Konflikten kommen. (Für die C++ Fraktion mann könnte auch eine Klasse daraus machen, aber wir sind hier in C)Was genau funktioniert nicht?
- Kompilierts nicht richtig oder
- stürtzt es beim laufen ab oder
- tut´s nicht was du willst?Wie soll man denn da helfen.
-
ich habs mal kopiert und kompiliert NACHDEM ich ale erforderlichen include dateien zammgesucht habe.
es funktioniert der obere teil nur das getch gibt bei den pfeiltasten der integervariable den asci-code 224 zurück. das zeichen für ne sondertaste und ansschliessend sendet das keyboard noch ein zahlencode, der ja aber vom getch nimmer erfasst wird.
somit funktioniert die bewegung mit den pfeiltasten im menü nicht.
PS: persönlich finde ich das HIER weniger die diskussion über unterfunktionen usw gestartet werden sollte. ich glaub das is jetzt wurscht. mein gott er hats halt so gemacht. was solls. das problem is eher das es nicht funzt.
-
was steht den in dem 2ten getchar Ergebiss
-
Normal sollte er da 80 für runter und 72 für hoch zurueckgeben, doch tut er das irgendwie nciht. Bei einem bekannten, der es auch so geloest hat, funktioniert es aber..
Da es aber mein erster Versuch ist, mit Pfeiltasten mein Menue zu steuern, weiss ich leider nicht mehr weiter.PS:
- Er kompiliert richtig
- Es stürzt nicht ab
- das einzige was nicht funktioniert, ist wie jack schon sagt das auslesen des zweiten Wertes.
-
Ich konnte es leider nicht testen, da ich im Moment keinen Compiler habe der gotoxy, setcolor _getch() bearbeitet.
Der Fehler könnte in dem zusätzlichen getch() gelegen haben das auf 13 abprüft. Frage warum getch und _getch gemischt?Probiers mal damit: Ich habe deinen Code in Unterfunktionen verpackt, da mehrfach gleicher Code auch immer äußerst Fehleranfällig
ist. Tief geschachtelte if elsif kann man oftmals besser in einem switch case unterpringen#define SONDER_TASTE 224 #define PFEIL_RUNTER 80 #define PFEIL_HOCH 72 #define ENDE 13 void ID1_Rahmen(void); // Zeichnen des Rahmens void ID1_Auswahl(int hilf); // Schreiben des Textes die mit hilf definierte Zeile wird markiert int ID1_Tastatur(int *hilf); // Tastaturbearbeitung int main() { int hilf=0; //Hilfsvariable zur Bestimmung des Curserortes while(1) { ID1_Rahmen(); ID1_Auswahl(hilf); if (1==ID1_Tastatur(&hilf)) break; } return 0; } void ID1_Rahmen(void) // Zeichnen des Rahmens { int i; for(i=0;i<60;i++) { gotoxy((10+i),1); printf("\315"); } gotoxy(9,1); printf("\311"); gotoxy(70,1); printf("\273"); for(i=2;i<11;i++) { gotoxy(9,i); printf("\272"); gotoxy(70,i); printf("\272"); } gotoxy(9,10); printf("\310"); gotoxy(70,10); printf("\274"); for(i=0;i<60;i++) { gotoxy((10+i),10); printf("\315"); } } void ID1_Auswahl(int hilf) // Schreiben des Textes die mit hilf definierte Zeile wird markiert { int ColorFeld[6]={{15},{15},{15},{15},{15},{15}}; char pre[6]={256,256,256,256,256,256}; ColorFeld[hilf]=12; pre[hilf]=257; gotoxy(13,3); setcolor(ColorFeld[0]); printf("%cEingabe eines neuen Teilnehmers\256",pre[0]); gotoxy(15,4); setcolor(ColorFeld[1]); printf("%cAnzeige aller gemeldeten Athleten\256",pre[1]); gotoxy(15,5); setcolor(ColorFeld[2]); printf("%cFestlegung der Rennen und Eingabe der Renndaten\256",pre[2]); gotoxy(15,5); setcolor(ColorFeld[3]); printf("%cAnzeige der Ergebnisliste aller Rennen\256",pre[3]); gotoxy(15,6); setcolor(ColorFeld[4]); printf("%cLoeschen der Eingatragenen Athleten\256",pre[4]); gotoxy(15,7); setcolor(ColorFeld[5]); printf("%cBeenden das Programms\256",pre[5]); } int ID1_Tastatur(int *hilf) // Tastaturbearbeitung { int abfrage; abfrage=_getch(); printf ("DebugAusgabe: abfrage = %i\n",abfrage); // Wenns geht auskommentieren switch(abfrage) { case SONDER_TASTE: { int abfrage1; abfrage1 = _getch(); printf ("DebugAusgabe: abfrage1= %i\n",abfrage1); // Wenns geht auskommentieren switch(abfrage1) { case PFEIL_RUNTER: (*hilf)++; break; case PFEIL_HOCH: (*hilf)--; break; default: ; } if ((*hilf) > 5) (*hilf)=0; if ((*hilf) < 0) (*hilf)=5; } break; case ENDE: return 1; break; default: ; } return 0; }
-
Diejenigen die hier auf Modularisierung hinweisen tun dies meist, da sie die schlechten Erfahrungen von langem linearen Code,
Codewiederholungen und Spagetti-Code schon gemacht haben. Der Fehler kann sich dann irgendwo verstecken.Bei modularisiertem Code kann man die Einzelteile (funktionen) sauber testen und muß nicht bei jeder Fehlersuche den ganzen großen
Block bearbeiten. Oftmals ist modularer Code in Summe kürzer als linearer Code
-
@PAD:
Zunächst mal vielen Dank für die Mühe, die du in mein Problem legst.
Desweiteren dachte ich mir 20 min vor lesen deines Beitrages auch, dass es an dem weiteren getch liegen koennte, doch lag es leider nicht.
Ich werde noch etwas probieren, und sollte ich nicht auf eine Lösung kommen, werde ich wohl mein Menü anders gestalten müssen, da am Montag abgabetermin dieses Projektes ist.
-
Was geht bei dir nicht?
Ich habe gerade den Code (meine Verbesserung) im Debugger durchgesteppt. Deine Methoden funktionieren richtig.
Was oich jetzt wissen müßte was geht genau nicht? Bitter sehr ausführlich schildern.
Die Tastatureingabe liefert wie gewünscht in hilf die Nummer der Zeile von 0 bis 5 zurück und reagiert sauber auf die Pfeil und return Taste.
Mein System Windows XP, Microsoft Visual C/C++ 6.0.
Das Projekt ist als Konsolanwendung erzeugt.
Die Header Dateien#include <conio.h> #include <ctype.h>
sind included
------------------------------------------------------------------------------------------------------------------------
Hab mir gerade im Dos Forum die "improved Console" besorgt und das Programm damit getestet Es funktioniert komplett.- Fehler im Programm: in der Routine ID1_Auswahl stimmt die Nummerierung des gotoxy ab Ausgabe der Renndaten nicht
das ist die Zeile 5 zweimal vergeben (ist auch in deinem Orginal so)
- Fehler im Programm: die erste Zeile ist zwei Zeichen weiter links las der Rest, oder rückst du die Zeile 2 Zeichen nach links
um sie zu markieren?.- Verbesserungsvorschlag pack ein setcolor(15); bevor du im Rahmen das erste Zeichen ausgibst
-
Die Funktion mit Ausrücken hatte noch einen kleinen Fehler, beim scrollen blieb der alte Text stehen
ist hier beseitigt.void ID1_Auswahl(int hilf) // Schreiben des Textes die mit hilf definierte Zeile wird markiert { int ColorFeld[6]={{15},{15},{15},{15},{15},{15}}; char pre[6]={256,256,256,256,256,256}; char ypos[6]={15,15,15,15,15,15}; int startpos=13; int i; ColorFeld[hilf]=12; pre[hilf]=257; ypos[hilf]=startpos; for (i=3;i<=8;i++) { gotoxy(startpos,i); printf(" "); } gotoxy(ypos[0],3); setcolor(ColorFeld[0]); printf("%c Eingabe eines neuen Teilnehmers\256 ",pre[0]); gotoxy(ypos[1],4); setcolor(ColorFeld[1]); printf("%c Anzeige aller gemeldeten Athleten\256 ",pre[1]); gotoxy(ypos[2],5); setcolor(ColorFeld[2]); printf("%c Festlegung der Rennen und Eingabe der Renndaten\256 ",pre[2]); gotoxy(ypos[3],6); setcolor(ColorFeld[3]); printf("%c Anzeige der Ergebnisliste aller Rennen\256 ",pre[3]); gotoxy(ypos[4],7); setcolor(ColorFeld[4]); printf("%c Loeschen der Eingatragenen Athleten\256 ",pre[4]); gotoxy(ypos[5],8); setcolor(ColorFeld[5]); printf("%c Beenden das Programms\256 ",pre[5]); printf("\n"); }
-
Bei mir ist folgendes Problem:
Das Menü am anfang baut sich richtig auf. Doch wenn ich dann mit den pfeiltasten nach oben/oder Unten drücke passiert nichts (ausser ein leichtes Flackern des Konsolenfensters).
Auch ich habe Microsoft Visual C/C++ 6.0. Aber unter Win2k. Headerteien sind includet.
-
Dann benutz doch mal den Debugger und schau was eigentlich passiert.
Du findest es den Debugger unter erstellen Debug starten
Win 2K sollte nichts ausmachen
-
Ok ich werde das Prog nun erst noch zuende stellen und später mal deien Ratschläge abarbeiten. Derweilen läuft die Navigation eben mit und für hoch und s für runter.
Dennoch danke ich dir erstmal für deien Mühe.Lyrix
-Edit-
Ok ich habe nun das Problem gefunden. Die Variable abfrage muss mit unsigned definiert werden. nun geht es.
Nocheinmal danke an alle die sich mit meinem Problem beschäftigt haben