C/Visual C - Problemas con kbhit y liberacion de buffer

 
Vista:

Problemas con kbhit y liberacion de buffer

Publicado por David (3 intervenciones) el 31/10/2002 14:39:56
Hola. Tengo un problema con un programa. Intento que al apretar una determinada tecla, el programa realice unas operaciones. Esto lo hago mediante la orden kbhit del modo:

while(1)
{
if (kbhit())
{
c=getch()
switch(c)
{
......
.........
/*Dependiendo de que tecla se pulsa, se hace una cosa, u otra*/
}
}
}

Hasta aqui bien. El problema, es que cuando se pulsa la misma tecla, la operacion a realizar es otra, pero como la tecla pulsada, ya esta en el buffer, el programa no reconoce la nueva pulsacion de la misma tecla, y entonces sigue haciendo lo mismo. Pense en usar la orden fflush(stdin) , pero no funciona, y en principio, sirve para eliminar el buffer del teclado.

A ver si alguien pudiera ayudarme
Gracias

David
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problemas con kbhit y liberacion de buffer

Publicado por felipe (9 intervenciones) el 31/10/2002 15:51:32
Hola, me gustaría ayudar, pero no entiendo esa parte de que si pulsas la misma tecla quieres realizar otra operación, exceptuando eso, el kbhit me resulta perfectamente.Quizás el problema esté en el case.

Suerte
Felipe
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas con kbhit y liberacion de buffer

Publicado por Alvaro (122 intervenciones) el 31/10/2002 16:03:26
Entiendo que haces lo siguiente:
Haces esperar al programa hasta que el usuario apreta una tecla.
Capturas ta tecla.
Asignas la tecla antigua en una variable.
si la tecla es 'X' (por ejemplo)
---si la tecla antigua es 'X' hacer operacion 2
sino
---hacer operacion 1
Deberias interiorizarte mas en los automatas de estado.
de manera que quede algo así:
while (c != ESC) {
---while (!kbhit()) {
-----operacion actual;
---}
---c = getch();
---switch(c) {
-----case 'X':
--------if (cOld == c)
-----------operacion actual = operacion 2
-------else
-----------operacion actual = operacion 1
---}
}
Esto es mas que un pseudocódigo pero supongo que la idea se entiende.
El getch() posterior al kbhit() debiese retornar siempre la tecla que se apretó, la diferencia está en el siclo while, que se sierra antes del getch().
SUERTE...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas con kbhit y liberacion de buffer

Publicado por David Velasco Peinado (3 intervenciones) el 04/11/2002 08:49:07
Hola. Gracias por responderme. Te detallo un poco el codigo:

main()
{
int c,OLDc;

while (1)
{

if(kbhit())
{
c=getch(); /*almaceno en "c" la tecla pulsada*/
fflush(stdin); /*intento borrar el buffer del teclado*/

}
switch (c)
{
/*Flecha-Arriba del teclado numerico*/
case '8':
if (OLDc<>c) /*Si la tecla pulsada anterior es distinta a la pulsada ahora*/
printf("Arriba");
/*Acciones para Mover el objeto hacia arriba*/

else /* Si la tecla pulsada es la misma,se para el objeto*/
printf("PArar");
/*Acciones para parar el objeto*/
break;
/*OTROS CASE*/
};
OLDc=c;
}
}

El problema esta en que la funcion fflush() no libera el buffer del teclado y hace que la funcion kbhit() siempre devuelva un valor distinto de 0 como resultado de haber pulsado una tecla. Pero el tema, es que ya a partir de ahora, ya siempre que entras en la condicional "if (kbhit())" la funcion devuelve un valor distinto de 0, y "c=getch()" coge la misma tecla aunque no se pulse nada, y si se pulsa la misma tecla, para el programa no hay ninguna diferencia, por lo que la bifurcacion en el "case" no se realiza como se quiere. El problema se resuelve si se consigue liberar el buffer del teclado (porque yo creo que es este donde kbhit busca si se ha pulsado una tecla).

Yo lo que prentendo hacer, es que cuando s
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problemas con kbhit y liberacion de buffer

Publicado por Alvaro (122 intervenciones) el 04/11/2002 21:49:15
El problema es que haces un if (kbhit())
Si haces un while(!kbhit()) todo solucionado.
while(1)
{
while(!kbhit()) {
//hacer lo que se debe segun el estado
}
c = getch();
switch(c) {
case 8:
if (c != oldC)
estado = ARRIBA;
else
estado = PARAR;
}
}

Así no necesitas el fflush();
SUERTE.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar