kbhit() und getch() plattformunabhängig



  • Hallo Leute!

    Gibt es eine plattformunabhängige Lösung für kbhit() und getch()?

    Aktuelle umsetzung:

    #ifdef _WIN32   
    char getinput()
    {
    	if(kbhit())
    	{        
    		return getch();
    	}
    
        return 0;	
    }
    //Linux-Version
    #else		
    char getinput()
    {
    	//initscr ();
    	//keypad (stdscr, TRUE);
    	//noecho();
    
    	if(kbhit())
    	{        
    		return getchar();
    		//return (char)getch();
    	}
    
        return 0;	
    }
    
    //da kbhit in der conio.h von Windows enthalten ist, muss diese unter Linux selbst
    //implementiert werden
    int kbhit(void)
    {
    	struct termios oldt, newt;
    	int ch;
    	int oldf;
    
    	tcgetattr(STDIN_FILENO, &oldt);
    	newt = oldt;
    	newt.c_lflag &= ~(ICANON | ECHO);
    	tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    	oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
    	fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
    
    	ch = getchar();
    
    	tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    	fcntl(STDIN_FILENO, F_SETFL, oldf);
    
    	if(ch != EOF)
    	{
    	ungetc(ch, stdin);
    	return 1;
    	}
    
    	return 0;
    }
    #endif
    

    Ich persönlich würde eine eiheitliche Lösung vorziehen. Gibt es sowas?

    Bin für jeden Vorschlag dankbar!

    Gruß
    WAR][FIRE



  • Er.
    Hatten wir das nicht gerade erst?
    Postest du immer alles doppelt?



  • es gab dort keine direkte Antwort!



  • Es gibt nicht auf jeder Plattform ein Keyboard => es kann niicht auf jeder Plattfomr kbhit() geben.


  • Administrator

    WAR][FIRE schrieb:

    es gab dort keine direkte Antwort!

    Wieso holst du dann nicht diesen Thread nach oben und fragst nochmals nach? Vielleicht war grad niemand online, der eine Antwort bereit hatte und als er dann schlussendlich online war, war der Thread auf Seite 2 oder noch weiter zurück.

    Absolut kein Grund gleich einen neuen Thread zu eröffnen.

    Ich weiss übrigens auch keine sinnvolle Lösung, welche nicht gleich zusätzlich ein riesiges weiteres Framework nach sich ziehen würde.

    Allerdings ist die Frage auch da, ob es denn unbedingt so gelöst werden muss? Bei Platformunabhängigkeit muss man manchmal gewisse Einschränkungen hinnehmen.

    Grüssli



  • pumuckl schrieb:

    Es gibt nicht auf jeder Plattform ein Keyboard => es kann niicht auf jeder Plattfomr kbhit() geben.

    Naja, kbhit() könnte man auf solchen Plattformen durchaus mit "return 0;" implementieren. Oder alternativ dem User-Programmer die Möglichkeit bieten den nötigen Input selbst zu "injecten".

    Es gibt auch nicht auf jeder Plattform eine Konsole, was aber den C und C++ Standard nicht daran hindert, Funktionen zu definieren, die mit der Konsole arbeiten.

    printf("Schlechtes Argument ;^)\n");
    


  • Dravere schrieb:

    WAR][FIRE schrieb:

    es gab dort keine direkte Antwort!

    Wieso holst du dann nicht diesen Thread nach oben und fragst nochmals nach? Vielleicht war grad niemand online, der eine Antwort bereit hatte und als er dann schlussendlich online war, war der Thread auf Seite 2 oder noch weiter zurück.

    Absolut kein Grund gleich einen neuen Thread zu eröffnen.

    Ich weiss übrigens auch keine sinnvolle Lösung, welche nicht gleich zusätzlich ein riesiges weiteres Framework nach sich ziehen würde.

    Allerdings ist die Frage auch da, ob es denn unbedingt so gelöst werden muss? Bei Platformunabhängigkeit muss man manchmal gewisse Einschränkungen hinnehmen.

    Grüssli

    Arg verdammt! Ich hatte deswegen ja schon extra einen Thread aufgemacht... Hatte irgendwie im Hinterkopf, dass das blos eine kleine Frage in einem anderen Thread von mir war.

    Von daher Entschuldigung 😞

    Gruß
    WAR][FIRE


Anmelden zum Antworten