"ständiges" einlesen von der Standardeingabe



  • Ich will einen Consolen basierende Version von Pong programmieren, alles auch kein Problem.

    Nur läuft das Spiel im Moment autonom ab, da ich nicht weiß wie ich folgendes Problem lösen soll:
    Ich will, das an einer bestimmten Stelle in der Spielschleife, von der Standardeingabe eingelesen wird. Falls kein Zeichen eingegeben wird, soll mit dem Code vortgefahren werden. Sodass nicht nach jedem Durchgang auf ein Zeichen+Enter gewartet wird, bis es weiter geht.

    Ich habe nun gedacht, man könnte das realisieren indem man in eine ungepufferte Eingabe, immer ein Newline-Zeichen schiebt, leider hat das nicht ganz funktioniert.

    Hat einer eine Idee/Quellcode wie man sowas mit der Standardbibliothek realisieren kann? Gibt es schon eine solche Standardfunktion btw. ist sowas nicht umsetzbar mit der Standardbibliothek?



  • goto:frage schrieb:

    Gibt es schon eine solche Standardfunktion btw. ist sowas nicht umsetzbar mit der Standardbibliothek?

    letzteres



  • Mit dem Standard geht's nicht (die Standard-Eingabe wartet, bis wirklich etwas kommt). Aber jenseits des Standards gibt es je nach BS Alternativmöglichkeiten (z.B kbhit()/getch()).



  • Genau. Sag mal dein Ziel-OS, dann kann man dich in das richtige Forum verschieben.



  • Ziel OS ist Linux, sollte aber eventuell auch unter Windows laufen.



  • Eine Variante die unter beiden Systemen gleich funktioniert kenne ich nicht. Da dein eigentliches Ziel Linux ist, verschiebe ich dich mal dahin. ncurses[1] wäre da eine interessante Lösung.
    Wenn du das unter Linux mal am laufen hast, kannst du ja in "DOS und Win32-Konsole" nochmal einen Thread starten um das Vorgehen unter Windows zu klären. Vielleicht gibt es ja auch einen curses-port für win32, ich glaube sowas hier demletzt mal gelesen zu haben.

    [1] http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/



  • Dieser Thread wurde von Moderator/in TactX aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Wow, die haben hier ja sogar was in der FAQ stehen 😉



  • fd_set fds;
    struct timeval tv;
    while(1)
    {
        tv.tv_sec = tv.tv_usec = 0;
        FD_ZERO(&fds);
        FD_SET(STDIN_FILENO, &fds);
        if(select(STDIN_FILENO+1, &fds, NULL, NULL, &tv) > 0)
        {
            // man kann von stdin lesen, evtl noch mit FD_ISSET prüfen, sollte aber nicht nötig sein.
        }
        else
        {
            // man kann nicht lesen.
        }
    }
    


  • Vielen Dank für den Tipp mit der ncurses Bibliothek, ich les mir grad nen Tutorial dazu durch. 🙂
    Hab aber mal eine allgemeine Frage:

    /* test.c */
    #include <curses.h>
    
    void quit(void)
    {
            endwin();
    }
    
    int main(void)
    {
            initscr();
         [u]atexit(quit);[/u]
            return 0;
    }
    

    Warum darf bei quit keine Klammern am Ende sein?
    Wenn ich eine Funktion aufrufe (auch eine void-Funktion), dann gibt man doch die Klammern mit an?!



  • Der reine Name einer Funktion verhält sich wie ein Zeiger auf eine Funktion. Da du die Funktion quit beim Aufruf von atexit() aber noch nicht aufrufen sollst/willst, übergibst du atexit() nur einen Zeiger auf deine Funktion. Dieser wird dann von atexit() "regisitriert" und eben beim Programmende ausgeführt.


Log in to reply