# keyboard cache löschen



## Macbeth23 (15. Mai 2005)

Hi,

 ich habe in C ein kleines Spiel geschrieben, nur funktioniert es nicht ganz, den keyboard cache zu löschen.
 Wenn ich jetzt zB 5x nach links drücke, werden erst die 5mal abgearbeitet, bevor ein neuer Tastendruck bearbeitet werden kann.

 Normal soll es ja dafür die Funktion fflush(stdin) geben... nur hilft die kein bischen.
 Deshalb hab ich mir überlegt, dass ein if(kbhit()!=0) { getch;} helfen müsste, um die nachfolgenden Tastenbefehle abzufangen. Leider funktioiert auch das nicht.
 Hat jemand eine andere Idee, wie es funktionieren könnte?


----------



## MFC openGL (15. Mai 2005)

fflush();  Sollte dein Problem beheben, das löscht den Cache.

Poste mal deinen Code, dann kann man mal schaun.


----------



## Macbeth23 (15. Mai 2005)

ich hab zwar keine Ahnung, was das stdin in  fflush(stdin) heißt, aber aufjedenfall funktioniert es nicht.

 Hab mal folgendes Programm geschrieben, das es demonstrieren wird.


```
#include <stdio.h>
 #include <windows.h>
 #include <conio.h>
 
 void main()
 {
 	char cEingabe, i, j=0;
 
 	printf("Druecke inerhalb 3sec mehrmals h ein:");
 	
 	fflush (stdin);
 	cEingabe = getch();
 	
 	system("cls");
 
 	Sleep (3000);
 
 	printf ("\n\nWarte 5s");
 	
 	do{
 		for (i=0; i<3; i++)
 		{
 			Sleep (500);
 			printf (".");
 			j++;
 			if (i==2)
 			{
 				system("cls");
 				printf ("\n\nWarte 5s");
 			}
 		}
 	}while (j<10);
 	
 
 	system("cls");
 	
 	printf("Soltest du das lesen, hat fflush funktioniert");
 	fflush (stdin);
 	cEingabe = getch();
 	
 	if (cEingabe == 'h')
 		for (i=0; i<50; i++)
 		{
 		    printf("Soltest du das lesen, wurde %d Eingaben uebersprungen und somit hat fflush nicht funktioniert.", i);
 			fflush (stdin);
 			cEingabe = getch();
 			system("cls");
 			if (cEingabe != 'h')
 				i=50;
 		}
 }
```


----------



## MFC openGL (15. Mai 2005)

Probiere mal statt getch();   getchar();  evtl behebt das ja schon dein Problem...


----------



## Macbeth23 (15. Mai 2005)

getchar ist aber jetzt für meine Zwecke ziemlich ungeeignet...


----------



## MFC openGL (15. Mai 2005)

Mach das mal als INT  i, j=0;  Wie biste denn auf die Idee gekommen da nen Char zu nehmen ?

Wenn du meinst das getchar(); ungeeigent für dein Programm ist, dann kannste auch cin oder scanf() nehmen...


----------



## Tobias K. (15. Mai 2005)

moin




			
				MFC openGL hat gesagt.:
			
		

> dann kannste auch cin oder scanf() nehmen.


Was soll er mit cin wenn er ein Programm in C schreiben will?!


@Macbeth23
Folgender Code macht was du möchtest, plus ein kleines extra das dich interessieren dürfte:

```
printf("Soltest du das lesen, hat fflush funktioniert");
int numflushed;
numflushed = _flushall();
cEingabe = getch();
```
In numflushed steht di Anzahl der noch im Puffer verbliebenen Hs.


mfg
umbrasaxum


----------



## Macbeth23 (15. Mai 2005)

```
int numflushed;
numflushed = _flushall();
cEingabe = getch();
```
 
 funktioniert leider auch nicht...

 jedoch wenn ich vieleicht mal meine Fehlermeldungen gelesen hätte, dann hätte ich mir den Threat sparen können.

 Also meine Idee mit 

```
if(kbhit()!=0)
 				getch();
```
 hätte schon funktioniert. Nur hab ich die Klammern bei getch vergessen 

 Trotzdem interessiert mich, warum fflush nicht funktioiert.
 Da ich bei meinem Studium auch c Programmieren muss, hab ich mal den Prof gefragt, und der meinte bloß, dass der Computer zu schnell sei und die Arbeitschritte zu schnell abarbeite (Die Antwort hat er sich schnell aus den Fingern gezogen, als er mir nicht zeigen konnte, dass fflush funktioniert). Jedoch befriedigt mich die Antwort nicht, da ja die Reinfolge des Programmes bestehen bleigt.

 Hat vieielicht jemand von euch ne Idee an was das liegen kann.

 Naja... hab ja jetzt eine alternative gefunden


----------



## Aylon (15. Mai 2005)

Hm bin wohl gerade zu Müde, aber wo funktioniert das Beispiel Programm nicht?
Übrigens wenn ich mich nicht irre hat offiziell fflush(stdin) undefiniertes Verhalten.


----------



## Macbeth23 (16. Mai 2005)

Aylon hat gesagt.:
			
		

> Hm bin wohl gerade zu Müde, aber wo funktioniert das Beispiel Programm nicht?


 Bei mir werden alle noch im Cache befindenen Zeichen weiterhin verarbeitet, und so zählt die whileschleife weiter. Das dürfte aber nicht passieren, wenn fflush den cache wirklich löschen würde.




			
				Aylon hat gesagt.:
			
		

> Übrigens wenn ich mich nicht irre hat offiziell fflush(stdin) undefiniertes Verhalten.


  Das heißt?


 Und leider hab ich jetzt an meiner Lösung, ein kleines Problem gefunden: Es werden nicht mehr alle Tasten angenommen (Nur Pfeiltasen; keine Buchstaben).
  Hab aber keine Ahnung an was das liegen kann.

  Hier mal ein Ausschnitt meines Programmes:

```
do
  		{
  			if (Steuerung(&iPosX, &iPosY)==-1)
 				return 0;	
  			iStatus1=Visualisierung(iZyklus, iPosX, iPosY);
  			iZyklus++;
  			ZeigeHindernisse(&Hindernisse);
 			iStatus2 = CheckHindernisCrash(iPosX, iPosY, &Hindernisse);
  			
  			//Keboardcache löschen
  			if(kbhit()!=0)
  				getch();
 		 		 			
  
  		}while (iStatus1==0 && iStatus2==0);
```
 

  und hier die Steuerung()

```
int Steuerung(int *iPosX, int *iPosY)
  {	
  	int iEingabe=0, iPause;  
  
  	if(kbhit()==0)
  		iEingabe=0;
  	else
  		iEingabe=getch();
  
  	if (iEingabe==27) /* Esc drücken -> Abbruch */
  		return -1;
  	
  	else {
  		if (iEingabe==77)	/* rechts */
  			(*iPosX)++;
  		if (iEingabe==75)	/* links */
  			(*iPosX)--;
  		if (iEingabe==72)	/* oben */
  			(*iPosY)--;
  		if (iEingabe==80)	/* unten */
  			(*iPosY)++;
  		if (iEingabe == 32)  /*pause*/
  		{
  			Console_Goto_xy(0, STRASSENLAENGE+1);
  			printf("\n\n\n\tPAUSE\n(weiter mit beliebiger Taste)");
  			iPause=getch();
  		}
 		return 0;			/* kein Fehler */
  	}
  }
```


----------

