no entiendo el funcionamiento del getch

Iniciado por raxor12, 9 Febrero 2015, 06:46 AM

0 Miembros y 1 Visitante están viendo este tema.

raxor12

Tengo una duda con el funcionamiento del getch en este codigo

char a= NULL,b=NULL;
while(a!='a'){

if(kbhit()){
    a=getch();}

b=getch();
    cout << a;
    cout << b;
}

Si pongo el codigo asi no se guarda nada en la variable 'a' solo en la 'b' al menos que precione la flechas de direcciones, eso es lo unico a guarda en 'a'

pero si lo coloco sin b=getch() si me lo acepta

Enserio no entiendo alguien podria ayudarme!!

eferion

Sucede lo siguiente:

"kbhit", que dicho sea de paso no forma parte del estándar de C, realiza una consulta al buffer del teclado y retorna 1 si hay datos a la espera de ser leídos. Dado que esta consulta no es bloqueante, salvo que haya datos en el buffer, el programa saltará el if y se irá directamente a la instrucción "b = getch( );". Dado que getch si es bloqueante, el programa se queda congelado a la espera de que introduzcas algo por el teclado. Cuando pulsas una tecla, entonces el programa almacena el dato en b y vuelve a repetir el bucle... si no te da tiempo a pulsar una tecla antes de que el programa vuelva a consultar "kbhit", el programa ignorará nuevamente la línea "a=getch();" y vuelta a empezar.

Cuando tu usas las teclas de dirección estás haciendo uso de caracteres extendidos... estos caracteres no ocupan un "char", sino dos o más, entonces la línea "b=getch()" extrae uno de esos... el bucle llega a "kbhit" y entonces sí hay datos en el buffer, por lo que ejecuta la instrucción "a=getch()".

Solo un par de aclaraciones adicionales:

1. El código es obligatorio decorarlo con las etiquetas GeSHi
2. Asignarle NULL a un char, si bien es algo que compila, no es técnicamente correcto, ya que puede dar la errónea sensación de que "a" y "b" son punteros. Es más conveniente sustituir esos "NULL" por '\0' (nota las comillas simples).

Un saludo.

raxor12

Gracias por la aclaracion eferion! no conocia eso de caracteres extendido indagare sobre ellos un poco, y gracias por tu aclaraciones adicionales!

Pero me quedan unas dudas!
-kbhit() no me lee aunque deje un tecla presiona ¿por que?, porque el ciclo pasa muy rapido que no le da tiempo de leerlo?
-Y que son las etiquetas "GeSHi"

esas son mis dudas..

Gracias de ante mano!

eferion

Cita de: raxor12 en 10 Febrero 2015, 04:58 AM
-kbhit() no me lee aunque deje un tecla presiona ¿por que?, porque el ciclo pasa muy rapido que no le da tiempo de leerlo?

kbhit no forma parte del estándar y no he tenido opción a usarla. Simplemente me he remitido a lo que he encontrado en Internet. Siento no poder ayudarte en este punto.

Cita de: raxor12 en 10 Febrero 2015, 04:58 AM
-Y que son las etiquetas "GeSHi"

En la ventana donde escribes mensajes, si miras encima de los iconos, encontrarás un combobox (las listas desplegables) con el texto "GeSHi". Si despliegas el control te aparecerán enumerados diferentes lenguajes de programación. Coloca el texto entre estas etiquetas y conseguirás que el mismo aparezca formateado y con colores, lo que facilita enormemente su lectura directamente desde el foro.

Un saludo.