• Domingo 15 de Diciembre de 2024, 05:54

Autor Tema:  Teclas especial  (Leído 5150 veces)

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Teclas especial
« en: Sábado 4 de Diciembre de 2010, 16:31 »
0
Hola a todos, estoy intentando hacr una pequeña funcion que detecte las teclas del tipo backspace, fecha hacia arriba....Lo que he intentado de momento no me funciona:

Citar
char c = getchar();
   while (1)
   {
      if (c == 0x08) //Backspace
      {
         printf("BS pulsado");
      }
      c = getchar();
   }

Alguna sugerencia??

Muchas gracias

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #1 en: Sábado 4 de Diciembre de 2010, 18:05 »
0
No hay ninguna función estándar para eso. ¿En qué plataforma estás desarrollando?

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #2 en: Sábado 4 de Diciembre de 2010, 19:17 »
0
Estoy desarrollando en ubuntu, usando como ide a eclipse con el plugins CDT para C, aunque también me haría falta que funcionara en windows.

Un saludo y gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #3 en: Sábado 4 de Diciembre de 2010, 19:46 »
0
No puede ser que funcione en ambos. A menos no que yo sepa.

Saludos

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #4 en: Sábado 4 de Diciembre de 2010, 20:10 »
0
Ok y para ubuntu sabes mas o menos como sería??

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #5 en: Sábado 4 de Diciembre de 2010, 20:53 »
0
Personalmente usaría una librería para ello, como Allegro. Yo siempre lo he hecho así, y es más sencillo.

También puedes probar y cacharrear con getch(), en curses.h

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #6 en: Domingo 5 de Diciembre de 2010, 12:46 »
0
Muchas gracias por las respuestas, estoy probando con curses.h y como tu dices esta la función getch(), pero no he conseguido que compile, se que esto no es de C pero si me puedes ayudar te lo agadecería ya que soy un poco nuevo con esto de programar en linux, te comento lo que he hecho.

Me descargue la librería y la metí en /usr/include, despues en el programa la incluí #include <curses.h> y eclipse es capaz de detectarla y además me da la opción de ver las funciones que puedo usar de esa librería, pues bien cuando le doy a compilar me da el siguiente error:
  undefined reference to `stdscr'
  undefined reference to `wgetch'

por lo que he leido por lo qe se ve hace falta compilar incluyendo -lcurses pero esto es desde la línea de comandos, ¿no sabrías donde tengo que incluir esto en mi IDE?

Un saludo y muchas gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #7 en: Domingo 5 de Diciembre de 2010, 13:51 »
0
Ya que estás programando el Linux, te aconsejo que lo hagas de la manera estándar, es decir, usando make. Eclipse soporta perfectamente proyectos con Makefile. Sólo tienes que dejar el Makefile en la raíz del proyecto, y ahí pones los enlaces a las librerías que necesites. Después puedes elegir el objetivo (target) del Makefile que quieras usando el mismo Eclipse





Si nunca has usado Makefiles o tienes problemas, lo vemos.

Saludos y ánimo con ese Linux  :good:

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #8 en: Domingo 5 de Diciembre de 2010, 16:51 »
0
OK, he estado leyendo sobre makefile y mas o menos entiendo cual es su función, pero no sabría construir uno ahora mismo xDD, he encontrado uno que  me ha generado automaticamente eclipse en la ruta del proyeco, ¿podría añadir a ese las librerías que necisto para que compile? este es el makefile:

Citar
################################################################################
# Automatically-generated file. Do not edit!
################################################################################

-include ../makefile.init

RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include src/subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif

-include ../makefile.defs

# Add inputs and outputs from these tool invocations to the build variables


# All Target
all: PRUEBA_C

# Tool invocations
PRUEBA_C: $(OBJS) $(USER_OBJS)LDFLAGS=-L./
   LDLIBS=-lfich

   @echo 'Building target: $@'
   @echo 'Invoking: GCC C Linker'
   gcc  -o"PRUEBA_C" $(OBJS) $(USER_OBJS) $(LIBS)
   @echo 'Finished building target: $@'
   @echo ' '

# Other Targets
clean:
   -$(RM) $(OBJS)$(C_DEPS)$(EXECUTABLES) PRUEBA_C
   -@echo ' '

.PHONY: all clean dependents
.SECONDARY:

-include ../makefile.targets

Si es posible modficar este, ¿donde deberia incluir las librerias?

Muchas gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #9 en: Domingo 5 de Diciembre de 2010, 18:07 »
0
Sí claro:

Código: Text
  1. LDLIBS=-lfich -lcurses
  2.  
Aunque ya te dice que ni lo toques  :lol:

Y por favor, en el foro utiliza las etiquetas code para el código  ^_^

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #10 en: Domingo 5 de Diciembre de 2010, 18:25 »
0
Pues sigue dandome el mismo error, ¿puede ser por la ruta? he leido que el Tag LDFLAGS=-L./ indica el directorio de las librerias, pero no lo he modificado por que la librería curses.h yo la he metido en /usr/include con todas las librerías estandar y estas no me dan problemas.

Thx

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #11 en: Domingo 5 de Diciembre de 2010, 18:39 »
0
¿Por qué no pruebas desde el terminal a meterle la librería, a ver qué te dice?

Código: Text
  1. gcc -lcurses etc...
  2.  

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #12 en: Domingo 5 de Diciembre de 2010, 19:03 »
0
Esto es lo que me devuelve, cuanto más investigo más cuenta me doy de que no se nadaa :ouch:
Código: C
  1. gcc -o PRUEBA_C.c -lcurses
  2. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 0 has invalid symbol index 12
  3. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 1 has invalid symbol index 13
  4. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
  5. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
  6. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 4 has invalid symbol index 12
  7. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 5 has invalid symbol index 14
  8. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 6 has invalid symbol index 14
  9. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 7 has invalid symbol index 14
  10. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
  11. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
  12. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 10 has invalid symbol index 13
  13. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 11 has invalid symbol index 14
  14. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 12 has invalid symbol index 14
  15. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 13 has invalid symbol index 14
  16. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 14 has invalid symbol index 14
  17. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 15 has invalid symbol index 14
  18. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 16 has invalid symbol index 14
  19. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 17 has invalid symbol index 14
  20. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 18 has invalid symbol index 14
  21. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 19 has invalid symbol index 14
  22. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 20 has invalid symbol index 14
  23. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 21 has invalid symbol index 14
  24. /usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 22 has invalid symbol index 22
  25. /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
  26. (.text+0x18): undefined reference to `main'
  27. collect2: ld returned 1 exit status
  28.  
  29.  

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Teclas especial
« Respuesta #13 en: Domingo 5 de Diciembre de 2010, 19:13 »
0
Esta version de more usa ioctl y termios para leer las teclas, aunque solo funciona para sistemas POSIX, y no usa (N)curses.

Para Windows:
http://msdn.microsoft.com/en-us/library/ms685035(VS.85).aspx
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #14 en: Domingo 5 de Diciembre de 2010, 20:41 »
0
Uf, eso es muy raro... Jamás lo había visto. Yo que tú usaría una librería más adecuada que curses. O bien muéstranos un poco el código que tienes.

No entiendo su-... Él lo que quiere es usar getch. No veo qué tiene que ver more.

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Teclas especial
« Respuesta #15 en: Domingo 5 de Diciembre de 2010, 21:05 »
0
11_8_88:

Por ahi comentas que copiaste el curses.h, pero de donde?
Instalaste la libreria?

cualquier cosa proba poner lo siguiente en la consola:

Citar
sudo aptitude install libncurses5 libncurses5-dev

m0skit0:

su no se refiere al more en si, sino a como esta implementado.

aca dejo un codigo que me robe de por ahi hace un tiempo

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <termio.h>
  5. #include <sys/ioctl.h>
  6.  
  7. #define STDINFD  0
  8. #undef getc
  9.  
  10. char getche(void) {
  11.   char c;
  12.   struct termio param_ant, params;
  13.  
  14.   ioctl(STDINFD,TCGETA,&param_ant);
  15.  
  16.   params = param_ant;
  17.   params.c_lflag &= ~(ICANON|ECHO);
  18.   params.c_cc[4] = 1;
  19.  
  20.   ioctl(STDINFD,TCSETA,&params);
  21.  
  22.   fflush(stdin); fflush(stderr); fflush(stdout);
  23.   read(STDINFD,&c,1);
  24.  
  25.   ioctl(STDINFD,TCSETA,&param_ant);
  26.   return c;
  27. }
  28.  
  29.  

Saludos
The sweet smell of a great sorrow lies over the land.


11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #16 en: Domingo 5 de Diciembre de 2010, 21:11 »
0
En realidad el código es muy simple, ya que de momento estoy solo haciendo pruebas, es el mismo que el del primer mensaje de este post, cambiando getchr() por getch() e incluyendo la libreria curses.h.

Thx

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #17 en: Domingo 5 de Diciembre de 2010, 21:40 »
0
Gracias por la aclaración Epa.

Sí bueno, se puede rescribir getch, pero ¿para qué si hay librerías que la oferecen? No me gusta reinventar la rueda a menos que sea para aprender cómo se fabrica  :P

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Teclas especial
« Respuesta #18 en: Domingo 5 de Diciembre de 2010, 21:43 »
0
Te vuelvo a repetir.

Proba poner lo siguiente en la consola:
Citar
sudo aptitude install libncurses5 libncurses5-dev
The sweet smell of a great sorrow lies over the land.


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Teclas especial
« Respuesta #19 en: Domingo 5 de Diciembre de 2010, 21:46 »
0
Cita de: "11_8_88"
En realidad el código es muy simple, ya que de momento estoy solo haciendo pruebas, es el mismo que el del primer mensaje de este post, cambiando getchr() por getch() e incluyendo la libreria curses.h.
Entonces tienes mal instalado el entorno de desarrollo o la librería curses, porque a mí me compila (pero no funciona como tú quieres):

Código: C
  1. #include <stdio.h>
  2. #include <curses.h>
  3.  
  4. int main()
  5. {
  6.     char c = getchar();
  7.     if (c == 0x08) //Backspace
  8.     {
  9.         printf("BS pulsado");
  10.     }
  11.     c = getchar();
  12.     return 0;
  13. }
  14.  



Primero mira a ver qué pasa con curses como dice Epa, y de todas formas, insisto y te aconsejo que uses otra librería como Allegro o SDL.

Saludos

11_8_88

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re: Teclas especial
« Respuesta #20 en: Domingo 5 de Diciembre de 2010, 22:26 »
0
Bueno, muchas gracias a todos al final ya compila desde la consola pero en eclipse no, seguiréprobando.

Un saludo y muchas gracia por la ayuda.

P.D. Me he fijado que eclipse cada vez que compila genera automaticamente un makefile y me borra la inclusión que le hago a mano de la librería con -lcurses, puede que este ahí el fallo?

P.D. Solucionado, era eso, he encontrado como añadir librerias, lo dejo por aquí por si alguna vez le sirve a alguien.

En las propiedades del proyecto -> C/C++ Build -> Setting y aquí en GCC Linker-> Libraries: tenemos dos partes una para las librerias con -l u otra para las rutas -L

Un saludo y muchas gracias.