Publi

Actualizado stermp.h (getch(), getche() y kbhit() en Linux)

Hace más de un año publiqué algunas funciones para manejar colores en la terminal de forma fácil. (Ver link). El objetivo era aprender un poco cómo funciona la terminal, y de paso ayudarme con mis alumnos de clases particulares (casi todos utilizan conio.h), yo quería una alternativa; por otra parte, facilitar el uso en proyectos pequeños, ya que si queremos algo más, para eso está ncurses.

Me he decidido sacar una segunda versión, ya que la primera no disponía de sustituto para getch() ni kbhit(), recordemos que estas funciones son para pedir un carácter desde teclado sin echo y sin necesidad de pulsar ENTER, y detectar la pulsación de una tecla sin parar la ejecución del programa respectivamente.

Tengo que avisar también de que este código no funciona con las flechas del teclado (estas teclas no tienen un carácter asociado y lo que hacen es devolver varios códigos de tecla, el primero de ellos ESC (27)), lo dejo para la próxima actualización.

También hay algunas correcciones, y algunas novedades internas.

Para descargar: stermp.h y stermp.c

Para compilar stermp (Simple Terminal Play):

$ gcc -c stermp.c

Para compilar nuestros proyectos:

$ gcc -o proyecto proyecto.c stermp.o

Y ahora un pequeño código de prueba:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <time.h>
#include "stermp.h"

void update_time()
{
  struct tm *tm;
  time_t _time;
  char texto[50];
  textcolor(YELLOW);
  _time=time(NULL);
  tm = localtime(&_time);
  strftime(texto,50,"%d/%m/%Y %H:%M:%S", tm);
  gotoxy(1,1);
  printf("%s    ", texto);
}

int main()
{
  int x,y;
  int ancho, alto;
  int tecla;
  term_init();
  ancho = screenwidth();
  alto = screenheight();

  /* Rellenamos de verde la pantalla */
  textbackground(GREEN);
  clrscr();

  textbackground(BLUE);
  /* Rellenamos de azul la primera fila */
  for (x=0; x<ancho; x++)
    printf(" ");

  gotoxy(1,alto);
  /* Rellenamos de azul la última fila */
  for (x=0; x<ancho; x++)
    printf(" ");

  gotoxy(2,2);
  while ((tecla=kbhit2())==0)
      update_time();    


  printf("Has pulsado: %d\n", tecla);

  term_defaults();
 
}

También podría interesarte....

There are 11 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. andres /
    Usando Google Chrome Google Chrome 15.0.874.120 en Linux Linux

    Y como hago para utilizarlo con codeblocks?

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 8.0 en Ubuntu Linux Ubuntu Linux

      Introduce el .h y el .cpp en tu proyecto y compílalo. Debería funcionar. Espero tu comentario.

  3. Adrian /
    Usando Mozilla Firefox Mozilla Firefox 11.0 en Ubuntu Linux Ubuntu Linux

    Estoy tratando de hacer andar el ejemplo «proyecto.c» pero tengo probkemas,

    Me da error la compilación, la cual realizo asi:
    $ gcc -o proyecto proyecto.c stermp.o

    /tmp/cc3nHWoW.o: In function `main’:
    proyecto.c:(.text+0xa2): undefined reference to `term_init’
    proyecto.c:(.text+0x14f): undefined reference to `kbhit2′
    proyecto.c:(.text+0x174): undefined reference to `term_defaults’
    collect2: ld returned 1 exit status

    El binario (ejecutable) no se genera.
    Desde ya te felicito por el aporte y te agradezco si me podés pasar algún dato.
    PD: stermp.c lo he probado con otro ejemlo y funciona bien. Claro, el mismo no tiene llamados a term_init, kbhit2, term_defaults.

  4. Gaspar Fernández / Post Author
    Usando Mozilla Firefox Mozilla Firefox 11.0 en Ubuntu Linux Ubuntu Linux

    @Adrian
    Gracias por tu comentario. Compilaste primero stermp.c ? Puedes probar también gcc -o proyecto proyecto.c stermp.c a ver qué tal.

    Saludos

  5. Gaspar Fernández / Post Author
    Usando Mozilla Firefox Mozilla Firefox 11.0 en Ubuntu Linux Ubuntu Linux

    @Gaspar Fernández
    Es bastante raro que no te deje compilar, a lo mejor te ha traicionado algún carácter en el copia y pega, tipo comillas o <>

    Saludos

  6. Pingback: Poesía binaria » Escribir con colores en la terminal al estilo C++ /

  7. psycho /
    Usando Mozilla Firefox Mozilla Firefox 26.0 en Ubuntu Linux Ubuntu Linux

    Hola. No se si aun estés activo aquí. Creo que ando un poquito atrasado en esta web pero es el mejor ejemplo que he encontrado, el cual me funciona a la perfección. Pero cuando quiero usar la misma parte del while(tecla=kbhit2()==0) en otro programa compila bien pero al correrlo me marca invalid argument Errno=22. Alguna idea del por qué?????

  8. Gaspar Fernández / Post Author
    Usando Mozilla Firefox Mozilla Firefox 27.0 en Ubuntu Linux Ubuntu Linux

    @psycho
    Perdona mi tardanza psycho, hay una versión actualizada en github (https://github.com/blakeyed/stermp) que arregla ese fallo.

  9. jlcruzunsj@gmail.com /
    Usando Google Chrome Google Chrome 37.0.0.0 en Android Android 5.0.1

    Tengo una librería en C ( stermp.c, stermp.h), una librería en C++ ( serialib.cpp, serialib.h). Además tengo un archivo.cpp donde está el programa principal y que necesita hacer uso de las dos librerías antes mencionadas. Compilando y haciendo uso de las librerías por separado, todo va bien. Cuando se compila el archivo.cpp que tiene el programa principal da error.
    Como se logra compilar y ejecutar correctamente?

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 63.0 en Ubuntu Linux Ubuntu Linux

      Por favor, pásame el error que te da y te echo una mano.

Leave a Reply to Gaspar Fernández Cancle Reply