if (kbhit()) {getch(); if (getch() == [Taste F1]){//beliebiger Code}}



  • Moin moin, nachdem mir die SuFu nicht geholfen hat schreibe ich hier mal meine Frage nieder (...hoffentlich habe ich das richtige Forum gewählt!?):

    Innerhalb eines (Konsolen-) Programms [C mit Dev C++] soll mit Hilfe des

    if (kbhit())
       {
       getch();
       }
    

    ein beliebiger Tastendruck erkannt und anschließen der Tastaurpuffer geleert werden. Das funktioniert. (Sonderfall Pfeiltasten vergessen wir hier mal)
    ABER: Zwei sonderfälle gibt mir die Aufgabenstellung vor. Wenn [F1] gedrückt wird, soll ein Hilfescreen, wenn [F12] gedrückt wird, soll ein "Aboutscreen" angezeigt werden.
    Frage: Übernimmt das Programm für jede Taste einen ASCII Code oder etwas vergleichbares? Und wenn ja, wie kann ich den im Programm erkennen?
    Eine Lösung stelle ich mir, damit sie in mein Programm passt, etwa so vor:

    "if (getch() == [Taste F1]){//beliebiger Code}}"

    Entgegen der allgemeinen Hinweise stelle ich hier unten nur zur zusätzlichen Information mein gesamtes Prog mit ins posting:

    //  Ziehung der Lottozahlen 6aus49
    
    #include <stdio.h>
    
    int main (void)
    {   
        int i=0;
        int j=0;
        int zahl=0;
        int ziehung[6];
            for (i=0; i<6; i++)
            {
                ziehung[i]=0;
            }
        int swap=0;
    
        system("cls");    
        printf("\n Ziehung der Lottozahlen 6aus49\n\n");
    
        for (j=0; j<7; j++)
        {
            switch (j)
            {
                  case 6: printf(" Druecke eine beliebige Taste um die Zusatzzahl zu ziehen!\n");
                  break;
                  default: printf(" Druecke eine beliebige Taste um die Zahl Nr. %d zu ziehen!\n", j+1);
            }
    
            // Durchzählen bis Tastendruck
            while (!kbhit())
            {
               zahl++;
               if (zahl==50)
               {
               zahl=1;
               }
            }    
    
            // Tastaturpuffer wieder entlehren (Ist ja nur ein Zeichen drin, wird also mit "getch()" auch nur eins abgeholt.)
            getch();
            //  Steuertasten werden in 2 (in Worten: ZWEI) Eingabezeichen übersetzt,
            //als erstes eine 0 oder 0xE0, danach den Code für die gedrückte Taste.
            if (kbhit())
            {
               getch();
            }
    
            if ((zahl == ziehung[0]) || (zahl == ziehung[1]) || (zahl == ziehung[2]) || (zahl == ziehung[3]) || (zahl == ziehung[4]) || (zahl == ziehung[5]))
            {
                     printf(" Es wurde schon wieder die %d gezogen, die Ziehung muss wiederholt werden.\n Bitte versuche es erneut!\n\n",zahl);
                     j--;
            }
    
            if ((zahl != ziehung[0]) && (zahl != ziehung[1]) && (zahl != ziehung[2]) && (zahl != ziehung[3]) && (zahl != ziehung[4]) && (zahl != ziehung[5]) )
            {
               ziehung[j]= zahl;
               switch (j)
               {
                      case 6: printf(" Die Zusatzzahl ist die %d.\n\n", zahl);
                      break;
                      default: printf(" Die gezogene Zahl ist die %d.\n\n", zahl);
               }
            }
    
        }
        system("cls");    
        printf("\n Ziehung der Lottozahlen 6aus49\n\n");
        printf("\n Die Lottozahlen im Ueberblick:       %d %d %d %d %d %d [%d]\n", ziehung[0],ziehung[1],ziehung[2],ziehung[3],ziehung[4],ziehung[5],ziehung[6]);
    
        // Ziehung in aufsteigende Reihenfolge bringen:
        j=0;
        i=0;
        for (j=0; j<5; j++)
        {
            for (i=0; i<5; i++)
            {
                if (ziehung[i] > ziehung[i+1])
                {
                swap = ziehung[i];
                ziehung[i] = ziehung[i+1];
                ziehung[i+1] = swap;
                }
    
            }
        }
        printf("\n ...und in aufsteigender Reihenfolge: %d %d %d %d %d %d [%d]\n", ziehung[0],ziehung[1],ziehung[2],ziehung[3],ziehung[4],ziehung[5],ziehung[6]);   
        printf("\n\n");
    
    return 0;
    }
    

    lg
    Christian



  • int c;
    while (1)
    {
        c = getchar(); // getchar() gibts im standard, getch() ist ne konsolenspezifische ergaenzung von borland
        printf("ascii %d = '%c'\n", c, c);
        if (c == 27) // ESC == ascii 27
            break;
    }
    

    dann probier mal rum.



  • Ok, das ist schon mal ein gutes "ascii-convert-tool"! Die sache hat aber zwei Haken:
    - Die Funktionstasten geben keinen ASCII-Code aus, sondern übernehmen (jedenfalls bei mir) spezielle Sonderfunktionen im Programm. [F1] ruft z.B. die letzte Eingabe noch mal auf.
    - getchar() unterbricht leider den Programmablauf, bis jemand etwas eingibt und [Enter] drückt, das soll aber nicht sein.
    Genauer: Es handelt sich um ein Lottoziehungsprogramm, bei dem durch Drücken einer beliebigen Taste eine weitere Zahl gezogen wird. Alle Tasten bis auf [F1] und [F12] sollen also die Durchzählschleife unterbrechen und eine "zufällige" Zahl generieren. Aber die beiden Funktionstasten sollen die Schleife unterbrechen und eine andere Textausgabe hervorrufen.

    Christian

    P.S.: Da sich bei deinem Prog auch nicht ESC einlesen lässt, funktioniert das "break;" nicht. *klugscheiss* 😉



  • touché *g*

    mit dem getch() sollte es aber funzen. du kannst eben nur nicht unterscheiden, ob es F1 oder ein ';' (59 dezimal) ist...



  • Doch, kannst du, allerdings mußt du dazu das vorige Eingabezeichen mit auswerten - Funktionstasten werden als zwei Zeichen gekennzeichnet (ein einzelnes 59 ist ';', die Folge 0,59 ist F1).

    (schau mal in die Konsolen-FAQ, da müsste eine Tabelle mit den wichtigsten Tastencodes verlinkt sein)



  • ...aber da muss ich gleich noch mal ein wenig klugsch-beep-:

    das Semicolon ";" gibt ascii: 59 zurück
    dagegen: [F1] gibt ascii: 0 && ascii 59 zurück!

    Heureka, ich hab´s (eigentlich wir haben´s) geschafft, damit lässt sich die [F1]-Taste (und natürlich auch die [F12]) eindeutig als gedrückt identifiezieren!

    Tausend Dank!

    Christian



  • ChrisPHL schrieb:

    das Semicolon ";" gibt ascii: 59 zurück
    dagegen: [F1] gibt ascii: 0 && ascii 59 zurück!

    Sag ich doch 😉



  • Hopla, das kommt davon, wenn man das Browserfenster einfach offen lässt und dann auch noch gleich antwortet, ohne mal [F5] gedrückt zu haben. *ismirdaspeinlich*

    Christian


Anmelden zum Antworten