[C con Clase] Terminar programa al pulsar tecla escape.

Pedro sr.whiteskull en hotmail.com
Mar Ago 31 22:50:00 CEST 2010


Ah! es verdad, que tu estabas liado con lo del teclado, y claro cómo ya había perdido el hilo pensé que tu eras el que tenía problema con los directorios y no se que.. total..prueba sustituir tu procedimiento kbhit por éste otro...

char teclaPulsada(void) {
  char caracter;
  struct termio parametro_anterior, parametro;

  ioctl(STDINFD,TCGETA,&parametro_anterior); // hacemos un backup, TC get

  parametro = parametro_anterior;
  parametro.c_lflag &= ~(ICANON|ECHO);
  parametro.c_cc[4] = 1;

  ioctl(STDINFD,TCSETA,&parametro); // le pasamos los nuevos paramentros

  fflush(stdin); fflush(stderr); fflush(stdout); // vaciamos los bufferes
  read(STDINFD,&caracter,1); // Leemos un byte del buffer y lo asignamos al caracter 

  ioctl(STDINFD,TCSETA,&param_anterior); // lo dejamos como estaba TC set
  return caracter;
}

el tema es que sólo funcionará en Linux... 

Información sobre el acceso al teclado en Linux, la necesitarás, yo ahora no puedo ayudarte porque estoy en Win y estoy ocupado... a lo mejor mañana si continuas con problemas, probamos y tal
http://www.zator.com/Hardware/H7_1_2b.htm

suerte


From: Jorge Vega Sanchez 
Sent: Tuesday, August 31, 2010 9:05 PM
To: Lista de correo sobre C y C++ 
Subject: Re: [C con Clase] Terminar programa al pulsar tecla escape.


Pues o no lo se hacer lo que dices o no funciona. 
Lo que he hecho es sustituir return 0 por system("pause") y return 0.


El 31/08/2010, a las 21:35, MuGliDaRk escribió:


  Al finalizar tu progrma usa



      system("PAUSE");
      return EXIT_SUCCESS;

  para al finalizar tu programa con escape. la pantalla se detenga y no se cierre. y espera la pulsacion de cualquier tecla, para cerrarse.





  El 31 de agosto de 2010 14:15, Jorge Vega Sanchez <memmaker650 en gmail.com> escribió:

    ¿¿ Y porque si lo pongo en un hilo cerrara el programa completo ??? 


    Es que no entiendo tu respuesta.

    El 31/08/2010, a las 21:10, David Fire escribió:


      pone el getch() en otro thread


      El 31 de agosto de 2010 16:07, Jorge Vega Sanchez <memmaker650 en gmail.com> escribió:

        Busque algo sobre algun port de knhit a linux y encontre lo siguiente: 
        En este enlace hay varias cosas.


        #include <stdio.h>
        #include <termios.h>
        #include <unistd.h>
        #include <sys/types.h>
        #include <sys/time.h>


        void changemode(int);
        int  kbhit(void);
        int main(void)
        {
          
          changemode(1);
          while ( !kbhit() )
          { // Funciona sin introducir caracteres.
          }


          sleep(20);
          
          return 0;
        }


        void changemode(int dir)
        {
          static struct termios oldt, newt;


          if ( dir == 1 )
          {
            tcgetattr( STDIN_FILENO, &oldt);
            newt = oldt;
            newt.c_lflag &= ~( ICANON | ECHO );
            tcsetattr( STDIN_FILENO, TCSANOW, &newt);
          }
          else
            tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
        }


        int kbhit (void)
        {
          struct timeval tv;
          fd_set rdfs;
          int ch=0,retorno;


          tv.tv_sec = 0;
          tv.tv_usec = 0;


          FD_ZERO(&rdfs);
          FD_SET (STDIN_FILENO, &rdfs);


          select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
          
          ch = getchar();


          printf("Got %c \n", ch);
          printf("En ASCII\n");
          printf("tenemos %d\n", ch);
          
          printf("Caracteres raros: %d\n", FD_ISSET(STDIN_FILENO, &rdfs));
          if(ch!=27)
           retorno=FD_ISSET(STDIN_FILENO, &rdfs);
          else
          {
           changemode(0);
           return 0;
          }
          
          return retorno;


        }




        Con este código consigo que detecte que hemos pulsado la tecla escape en mi caso (si se pulsa cualquier otra no pasa nada. El problema es que no termina el programa hasta que se cumple el Sleep y se deberia de terminar el programa cuando pulse ESCAPE.


        Por si alguien le echa un vistazo, el código es partiendo del código de THANTOS pero modificado.


        Queda poco para la solucion final pero no consigo el punto que falta.


        El 30/08/2010, a las 00:55, David Fire escribió:


          SI se puede hacer con c/c++ estandar 
          tenes q usar kbhit y getch
          kbhit te dice si hay alguna tecla esperando para ser leida y getch te da ese caracter.


          if(kbhit()){
            c=getch();
            if(c=ESC)
              exit();
          }


          saludos
          David


          El 29 de agosto de 2010 16:05, Jorge Vega Sanchez <memmaker650 en gmail.com> escribió:

            Y que librería puedo usar para hacer esto.

            El 29/08/2010, a las 18:15, Pedro Rodríguez González escribió:


              Usando la librería estándar de C/C++ ? Creo que no vas a poder.

              > From: memmaker650 en gmail.com
              > Date: Sun, 29 Aug 2010 10:52:37 +0200
              > To: cconclase en listas.conclase.net
              > Subject: [C con Clase] Terminar programa al pulsar tecla escape.
              > 
              > Buenas.
              > 
              > Estoy haciendo un programa de linea de comandos. Me gustaría saber como hacer que al pulsar la tecla escape se termine el programa.
              > Mi duda es como detectar el pulsado de la tecla ESC (en linux o MAC, no en Windows) y si es imprescindible tener un bucle global que compruebe el pulsado de la tecla o hay alguna otra forma más eficiente.
              > 
              > El programa va soltando soluciones o datos y no sé como mezclar esto con la deteccion de la tecla esc.
              > 
              > Gracias de antemano.
              > _______________________________________________
              > Lista de correo Cconclase Cconclase en listas.conclase.net
              > http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
              > Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
              _______________________________________________
              Lista de correo Cconclase Cconclase en listas.conclase.net
              http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
              Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ



            _______________________________________________
            Lista de correo Cconclase Cconclase en listas.conclase.net
            http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
            Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




          -- 
           (\__/) 
          (='.'=)This is Bunny. Copy and paste bunny into your 
          (")_(")signature to help him gain world domination. 


          _______________________________________________
          Lista de correo Cconclase Cconclase en listas.conclase.net
          http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
          Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ



        _______________________________________________
        Lista de correo Cconclase Cconclase en listas.conclase.net
        http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
        Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




      -- 
       (\__/) 
      (='.'=)This is Bunny. Copy and paste bunny into your 
      (")_(")signature to help him gain world domination. 

      _______________________________________________
      Lista de correo Cconclase Cconclase en listas.conclase.net
      http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
      Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ



    _______________________________________________
    Lista de correo Cconclase Cconclase en listas.conclase.net
    http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
    Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




  -- 
  Atte.
  _______________________________


  _______________________________


  Antes de imprimir este mensaje, asegúrese de que sea necesario. Proteger el medio ambiente está en nuestras manos. 
  Before you print this message, make sure it is necessary. It is in our hands to protect our environment.


  _______________________________________________
  Lista de correo Cconclase Cconclase en listas.conclase.net
  http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
  Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




--------------------------------------------------------------------------------


_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100831/83c5a36c/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: Emoticon10.gif
Type: image/gif
Size: 253 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100831/83c5a36c/attachment.gif>


Más información sobre la lista de distribución Cconclase