schleife und tasterturabfrage
-
ich will in einem switch/case eine tastertur abfrage machen und eine schleife!
es soll so funktionieren, dass der case'L': in einer schleife ist und wenn dann die Taste q gedrückt wird soll er aus der schleife gehen!mfg linux-tux
-
Hmmm irgendwie hab ich noch keine konkrete Vorstellung von dem was du willst. Ich kann nur erahnen, dass du in einer Schleife etwas ständig wiederholt machen willst bis der Anwender q drückt.
Also vom ANSI-C-Standard her geht sowas schon mal nicht. Allerdings gibt es bei einigen Compiler (Windows) eine Headerdatei namens conio.h. In dieser gibt es eine Funktion die kbhit() heißt. Wenn du mehr drüber wissen willst, dann schau mal in die Konsolen-FAQ. Da steht alles wichtige über die Funktion und da dürfte auch bereits dein Problem erklärt sein, denn das hatten schon einige ;).
PS: Mir ist grad noch aufgefallen, dass du ja im Nicknamen linux stehen hast. Für Linux gibts aber auch ne Möglichkeit abzufragen, ob eine Taste gedrückt wurde. Mit der Suche (linux + kbhit als Suchbegriffe) dürftest du den Thread finden, in dem der Quellcode ist. Möglicherweise findest du es auch in der Linux-FAQ.
-
linux-tux: Formuliere doch bitte zunächst mal eine allgemein verständliche Frage. Dann kannst Du auch eine Antwort erwarten.
Ich finde es erstaunlich, wie AJ aus Deiner Aneinanderreihung von Wörtern eine sinnvolle Fragestellung produzieren konnte (mir - und vielleicht noch anderen - war das nicht möglich).
Übrigens gibt es hier eine tolle "Vorschau"-Funktion, mit der man testen kann, ob man seinen eigenen Text versteht.
-
@Krösus
Meine Vermutungen stützen sich auf den letzten Teilsatz:linux-tux schrieb:
... und wenn dann die Taste q gedrückt wird soll er aus der schleife gehen!
-
Es gibt noch die Funktion GetAsyncKeyState(), die ist aber sicher nicht Standard.
-
Stentor schrieb:
Es gibt noch die Funktion GetAsyncKeyState(), die ist aber sicher nicht Standard.
ist winapi
-
sorry für die komische ausdrucksweise. ich war im stress.
so jetzt nochmal schön gesagt.
ich will über linux das parallel-port leds ansteuern (8 leds). jetzt habe ich das so gemacht, dass wenn ich die taste 1 drücke leuchtet das led 1, taste 2 = led 2 , usw. und dei der taste b blinken alle leds gleichzeitig.
mein problem ist jetzt das ich nicht ewig lange zeilen schreibe damit die leds blinken siondern nur 2 und die sollen sich wiederholen (schleife (if, while, ....). ich will jetzt wissen wie das geht, wenn ich das mit den tasten einlesen über switch/case mache.
wie soll ich das machen??hier das programm:
#include <stdio.h> #include <string.h> #include <sys/io.h> #define D_LPT1_DATA 0x378 int main( int argc, char *argv[], int a ) { int I_port; char *pC_port; I_port = D_LPT1_DATA; if ( ioperm( I_port, 3, 1) != 0 ) { /* get IO/perm */ perror( "ann LPT Device nicht öffnen,da es gerade verwendet wird." ); return(-1); } outb( 0x00, I_port ); printf( "\nProgramm wurde gestartet. Mit STRG+C wird das Programm beendet\n\nTatse 1 = LED1\nTaste 2 = LED2\nTaste 3 = LED3\nTaste 4 = LED4\nB/b = Alle LEDs blinken\nR/r = Setzt LPT-Port zurück\n\n", pC_port ); while( 1 ) { switch( a = getchar() ) { case '1': printf( "Taste '1' aktiviert\n" ); outb( 0x1, I_port ); break; case '2': printf( "Taste '2' aktiviert\n" ); outb( 0x2, I_port ); break; case '3': printf( "Taste '3' aktiviert\n" ); outb( 0x4, I_port); break; case '4': printf( "Taste '4' aktiviert\n" ); outb( 0x8, I_port); break; case 'r': case 'R': outb( 0x00, I_port ); printf( "LPT-Port wurde zurückgesetzt\n" ); break; case 'b': case 'B': outb( 0x00, I_port ); usleep( 1*200*1000 ); printf( "aus\n" ); outb( 0xff, I_port ); usleep( 1*200*1000 ); printf( "ein\n" ); break; case '\n': break; default: printf( "Taste NICHT belegt\n" ); outb( 0x00, I_port ); } } }
mfg linux-tux
-
Hi
Naja ne einfache Lösung wär//---------- snip ---- while((a=getchar())!='q'){ switch(a){ case 'b':... ..... } } //--------- snap -----
-
Aber ich seh grad, dass das garnicht mehr die Frage war. Öhm sry.
-
ok danke!naja war nicht die frage aber es hilft mir weiter wenn ich dan die schleife vom blinken beenden will!
weißt du/jemand wie man das mit der schleife macht??
kann ich das mit goto machen??und funktioniert das dan auch mit dem while als abfrage ob die taste q ist oder nicht????damit er weiß ob er herausgehen soll aus der schleife oder weiter blinken??mfg linux-tux
-
Also, du willst LEDs blinken lassen. Wenn du 1 drückst, soll nur das 1. LED leuchten, wenn 2 dann... usw. Bei b sollen alle LEDs "blinken".
Sollen die LEDs ständig blinken, solange du nichts anderes drückst? Dann glaub ich weiß ich was du suchst.Ansonsten versteh ich immer noch nicht ganz dein Problem. Versuch es mal mit Pseudocode auszudrücken wie es sein soll, vielleicht hilft das mehr.
-
ja genau. bei b sollen alle leds blinken. wenn ich die taste q drücke soll er vom blinken aufhören. alle anderen tasten dürfen das nicht nur mit q soll das blinken beendet werden.
mfg linux-tux
-
Variante mit kbhit():
... char z; char flag; ... case 'b': for(z=0, flag=0;z!='q';flag=!flag) { //LED blinken outb( (flag)?0xff:0x00 , I_port ); //Pause damits auch sichtbar ist ;) usleep(...); //Prüfen, ob Benutzer eine Taste gedrückt hat if(kbhit()) { //gedrückte Taste holen ohne Echo z=getch(); //restliche Eingaben verwerfen while(kbhit()) getch(); } } break; ...
Das ganze ist aber somit nicht mehr ANSI-C-Standard. Die Funktionen kbhit() und getch() gibts wahrscheinlich in Linux nicht direkt, aber ich habe schon ein paar Threads hier gesehen, die das Problem für Linux behandelt haben und auch Lösungen gekommen sind, wie du kbhit() und getch() in Linux nachbauen kannst. Benutze einfach mal die Suche dazu ;).