Problem mit dem Auslesen von Pfeiltasten



  • Hi,
    ich möchte ein Menü bei meinem Schulprojekt erstellen, das man mit dem Pfeiltasten steuern kann, nur funktioniert es nicht so wie es soll. Ich habe es lange nochmal ueberarbeitet, aber finde den fehler einfach nicht. Ich hoffe von euch kann mir da wer helfen.

    Mein Quellcode:

    void main()
    {
    
    		int abfrage;
    		int hilf=0; //Hilfsvariable zur Bestimmung des Curserortes
    		int i=0; //Indexvariable
    
    		while(1)
    		{
    		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");
    		}
    		if(hilf==0)
    		{
    				gotoxy(13,3);
    				setcolor(12);
    				printf("\257 Eingabe eines neuen Teilnehmers \256");
    				setcolor(15);
    				gotoxy(15,4);
    				printf("Anzeige aller gemeldeten Athleten");
    				gotoxy(15,5);
    				printf("Festlegung der Rennen und Eingabe der Renndaten");
    				gotoxy(15,5);
    				printf("Anzeige der Ergebnisliste aller Rennen");
    				gotoxy(15,6);
    				printf("Loeschen der Eingatragenen Athleten");
    				gotoxy(15,7);
    				printf("Beenden das Programms");
    		}
    		else if(hilf==1)
    		{
    				gotoxy(15,3);
    				printf("Eingabe eines neuen Teilnehmers ");
    				gotoxy(13,4);
    				setcolor(12);
    				printf("\257Anzeige aller gemeldeten Athleten \256");
    				setcolor(15);
    				gotoxy(15,5);
    				printf("Festlegung der Rennen und Eingabe der Renndaten");
    				gotoxy(15,5);
    				printf("Anzeige der Ergebnisliste aller Rennen");
    				gotoxy(15,6);
    				printf("Loeschen der Eingatragenen Athleten");
    				gotoxy(15,7);
    				printf("Beenden das Programms");
    		}
    		else if(hilf==2)
    		{
    				gotoxy(15,3);
    				printf("Eingabe eines neuen Teilnehmers");
    				gotoxy(15,4);
    				printf("Anzeige aller gemeldeten Athleten");
    				gotoxy(13,5);
    				setcolor(12);
    				printf("\257 Festlegung der Rennen und Eingabe der Renndaten \256");
    				setcolor(15);
    				gotoxy(15,5);
    				printf("Anzeige der Ergebnisliste aller Rennen");
    				gotoxy(15,6);
    				printf("Loeschen der Eingatragenen Athleten");
    				gotoxy(15,7);
    				printf("Beenden das Programms");
    		}
    		else if(hilf==3)
    		{
    				gotoxy(15,3);
    				printf("Eingabe eines Neuen Teilnehmers");
    				gotoxy(15,4);
    				printf("Anzeige aller gemeldeten Athleten");
    				gotoxy(15,5);
    				printf("Festlegung der Rennen und Eingabe der Renndaten");
    				gotoxy(13,5);
    				setcolor(12);
    				printf("\257 Anzeige der Ergebnisliste aller Rennen \256");
    				setcolor(15);
    				gotoxy(15,6);
    				printf("Loeschen der Eingatragenen Athleten");
    				gotoxy(15,7);
    				printf("Beenden das Programms");
    		}
    		else if(hilf==4)
    		{
    				gotoxy(15,3);
    				printf("Eingabe eines Neuen Teilnehmers");
    				gotoxy(15,4);
    				printf("Anzeige aller gemeldeten Athleten");
    				gotoxy(15,5);
    				printf("Festlegung der Rennen und Eingabe der Renndaten");
    				gotoxy(15,5);
    				printf("Anzeige der Ergebnisliste aller Rennen");
    				gotoxy(13,6);
    				setcolor(12);
    				printf("\257 Loeschen der Eingatragenen Athleten \256");
    				setcolor(15);
    				gotoxy(15,7);
    				printf("Beenden das Programms");
    		}
    		else if(hilf==5)
    		{
    				gotoxy(15,3);
    				printf("Eingabe eines Neuen Teilnehmers");
    				gotoxy(15,4);
    				printf("Anzeige aller gemeldeten Athleten");
    				gotoxy(15,5);
    				printf("Festlegung der Rennen und Eingabe der Renndaten");
    				gotoxy(15,5);
    				printf("Anzeige der Ergebnisliste aller Rennen");
    				gotoxy(15,6);
    				printf("Loeschen der Eingatragenen Athleten");
    				gotoxy(13,7);
    				setcolor(12);
    				printf("\257 Beenden das Programms \256");
    				setcolor(15);
    		}
    		abfrage=_getch();
    		if(abfrage==224)
    			{
    			abfrage = _getch();//danach muss man des nochma machen weil dann der tastencode kommt
    			if(abfrage == 80)//runter
    			{
    				if(hilf!=5)
    					hilf++;
    				else
    					hilf=0;
    			}
    			else if(abfrage == 72)//hoch
    			{
    				if(hilf!=0)
    					hilf--;
    				else
    					hilf=5;
    			}
    		}
    		if(getch()==13)
    			break;
    		}
    }
    


  • Die Modularisierung durch Funktionen würde für einen mächtigen Produktivitätsschub sorgen, da: Höhere Übersicht == Schnellere Fehlerentdeckung



  • Das problem dabei ist, dass diese Funktion dann in den Quellcode meines eigentlichen Programmes integriert wird. Testeshalber habe ich es mal Extern als eigensinniges Programm ausgeführt.
    Deshalb habe ich keien Funktionen gemacht, wegen dem späteren einbinden.



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


  • @Jack30lena

    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


Anmelden zum Antworten