Die Funktion getch() in einer while(true)-Schleife mit Zustandsautomat



  • Guten Tag C-Forum,

    ich hoffe ihr könnt mir weiterhelfen. Ich bin gerade dabei einen kleinen Zustandsautomat für eine Steuerung für eine Roboterspinne zu programmieren.
    Hier ist ein Code-Ausschnitt:

    while (1){
    if(kbhit())
    {
    in = getch(); //Einlesen ohne Enter, ASCII-Zeichen wird in "in" gespeichert
    }else{
    in = '#';
    }
    statemachine(in);
    sleep(2);
    }

    Unter Statemachine wird die Funktion Zustandsautomat aufgerufen, die mit switch(state) in den jeweiligen Zustand "Vorwärts gehen", "rückwärts gehen", "rechts drehen", "links gehen" springt. Das Problem dabei ist nun, das ich in jedem State die Schrittfolge 2-3 Sekunden durchspiele (hier gezeigt durch "sleep") und wenn ich nun den Finger länger auf z.B. "w" für vorwärts gehen lasse, steht "wwwwwwwwwwwwwwwwwwwwwwwwwwww" in der Konsole und die Spinne läuft die nächsten 5 min Vorwärts 😃

    Wisst ihr, wie ich die Konsole sozusagen "blockieren" kann, sodass immer nur auf die nächste Eingabe gewartet wird und nicht das nächste Zeichen von "wwwwwwwwwwwwwwwww" genommen wird?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Warum WinAPI?...



  • smolnar schrieb:

    Warum WinAPI?...

    Weil du Funktionen aus der Windows API benutzt.

    Versuchs mal mit nem while(kbhit()); direkt nach dem in = getch(); . Das sollte dazu führen, dass das Programm so lange blockiert, bis eine Taste auch tatsächlich losgelassen wird. Wenn ich mich nicht irr.



  • smolnar schrieb:

    Warum WinAPI?...

    Weil dein Problem nicht mit Mitteln aus der Standard-C-Library zu lösen ist.
    Du brauchst Systemspezifische Funktionen, die du ja auch schon nutzt.



  • @dieNull: Dein Vorschlag hat tatsächlich funktioniert

    [code]
    int getinput(void){
    int x=0;
    if(kbhit())
    {
    x = getch();
    while(kbhit()){ // Hier
    return(0); // die
    } // Lösung
    }else{
    x = '#';
    }
    return x;
    }//End getinput
    [\code]

    Danke!


Anmelden zum Antworten