elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
08 Octubre 2008, 07:53  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  no puedo hacer funcionar getch en linux
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: no puedo hacer funcionar getch en linux  (Leído 474 veces)
Proxy Lainux

Desconectado Desconectado

Mensajes: 138



Ver Perfil
no puedo hacer funcionar getch en linux
« en: 14 Mayo 2008, 02:26 »

hola

estoy intentando programar en linux y estoy volviendo a hacer varios ejemplos que anteriormente los hice en windows... pero tengo un problema con uno.. a ver si me pueden ayudar...

miren... es este, el problema que tengo es que no logro hacer lo que getch() hace en windows... estuve googleando un rato y encontre que para usar getch en linux se necesitaba la libreria curses.h... y para compilarlo se tiene que hacer esto

 gcc -o funlinx funlinx.c -lcurses

y pues si... con eso ya se puede compilar el programa haciendo funcionar getch... pero si recuerdan getch toma una letra que se escriba etc... pero continua con el codigo automaticamente... y cuando lo hago con linux se keda la pantalla recibiendo letras y no pasa nada.. y si pulso Enter.. solo cambia de linea pero sin pasar algo... y hasta alli se keda... no avanza.. alguien me podria decir porke? o como puedo modificar el programa para que funcione

espero me puedan ayudar... gracias  ;D

Código:
#include <stdio.h>
#include <curses.h>
#define FALSO 1
#define CIERTO 0

int finalizar();
int lea_char();

int main(){

int i = 0;
int fin = FALSO;

while(fin == FALSO){
i++;
printf("\ni = %d\n",i);
fin = finalizar();
}
printf("\nFin del programa\n");
return 0;
}

int finalizar(){
int c;
printf("\nDesea otro numero(s/n)\n");
do{
c = lea_char();
}
while((c != 'n') && (c != 's'));
return (c == 'n');
}

int lea_char(){
int j;
if((j = getch()) == 'N' || j == 'S')
return (j + ('a' - 'A'));
else
return j;
}
En línea
Flakito81

Desconectado Desconectado

Mensajes: 350



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #1 en: 14 Mayo 2008, 02:42 »

prueba a poner init_curses(); al principio del main

Suerte!
En línea
winfuck

Desconectado Desconectado

Mensajes: 254



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #2 en: 14 Mayo 2008, 02:43 »

bueno te felicito por salir dle infierno :P (i love flamewars :P)
bienvenido al mundo donde las cosas si las haces es porque sabes hacerlas (xD sorry), donde te haces hombre, bueno luego de decir mis boludeces, te paso el codigo para poder hacer lo que quieres:

fichero kbhit.c
Código:
#include <termios.h>
/* #include <term.h> */
#include <unistd.h>

static struct termios initial_settings, new_settings;
static int peek_character = -1;

void init_keyboard() {
        tcgetattr(0, &initial_settings);
        new_settings = initial_settings;
        new_settings.c_lflag &= ~ICANON;
        new_settings.c_lflag &= ~ECHO;
        new_settings.c_lflag &= ~ISIG;
        new_settings.c_cc[VMIN] = 0;
        new_settings.c_cc[VTIME] = 0;
        tcsetattr(0, TCSANOW, &initial_settings);
}

void close_keyboard() {
        tcsetattr(0, TCSANOW, &initial_settings);
}

int kbhit() {
        char ch;
        int nread;

        if(peek_character != -1)
                return 1;
        new_settings.c_cc[VMIN]=0;
        tcsetattr(0, TCSANOW, &new_settings);
        nread = read(0, &ch, 1);
        new_settings.c_cc[VMIN]=1;
        tcsetattr(0, TCSANOW, &new_settings);

        if(nread == 1) {
                peek_character = ch;
                return 1;
        }
        return 0;
}

int readch() {
        char ch;

        if(peek_character != -1) {
                ch = peek_character;
                peek_character = -1;
                return ch;
        }
        read(0, &ch, 1);
        return ch;
}

y eca un ejemplo de como usarlo:
Código:
#include <stdio.h>
#include "kbhit.c"

int main(void) {
        char car;
        int i=0;

        init_keyboard();

        while(car != 'q') {
                printf("%d\n", i++);
                if(kbhit())
                        car = readch();
        }

        close_keyboard();

        return 0;
}

espero que te ayude ;)

cya
En línea

|_|0|_|
|_|_|0|
|0|0|0|
winfuck

Desconectado Desconectado

Mensajes: 254



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #3 en: 14 Mayo 2008, 02:53 »

prueba a poner init_curses(); al principio del main

Suerte!

pues eso no le servira ya que no existe init_curses(), para inicializar la libreria tienes que usar
WINDOW *initscr(void);

cya
En línea

|_|0|_|
|_|_|0|
|0|0|0|
Proxy Lainux

Desconectado Desconectado

Mensajes: 138



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #4 en: 14 Mayo 2008, 03:14 »

hola

jeje gracias por las respuestas... pero kise compilar kbhit.c en linux y me aparecio este error...

/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
../sysdeps/i386/elf/start.S:115: referencia a `main' sin definir
collect2: ld returned 1 exit status

jeje.. bueno..  seguire investigando en google.. pero si se les ocurre algo.. porfa.. diganme...

nos vemos..  ;D
En línea
winfuck

Desconectado Desconectado

Mensajes: 254



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #5 en: 14 Mayo 2008, 03:55 »

hola

jeje gracias por las respuestas... pero kise compilar kbhit.c en linux y me aparecio este error...

/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start':
../sysdeps/i386/elf/start.S:115: referencia a `main' sin definir
collect2: ld returned 1 exit status

jeje.. bueno..  seguire investigando en google.. pero si se les ocurre algo.. porfa.. diganme...

nos vemos..  ;D

ahh bue!
lo que tienes que compilar es main.c, en kbhit.c solo estan las funciones para llevar a cabo lo que quieres, aunque no es la forma correcta de compilar los modulos, para una vista rapida te va a funcionar, ya que para hacerce bien tendrias que crear un header con los prototipos y luego compilar cada funete y linquearlos para generar el binario, pero bue es como ejemplo sencillo, asi que con compilar el main.c basta.

cya
En línea

|_|0|_|
|_|_|0|
|0|0|0|
^TiFa^

Desconectado Desconectado

Mensajes: 672


Need a Love Loan? Borrow some from me :)


Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #6 en: 14 Mayo 2008, 21:41 »

No te va a funcionar cielo... sobretodo si estas tratando de usar las curses. Aunque no le veo sentido... puesto que curses usa otras funciones en vez de printf, usamos printw, en vez de scanf usamos scanw en ncurses.... Y tambien usamos los posicionamientos en la pantalla con la funcioncita move, y cerramos la pantalla curses con endwin :)

Tambien se le da color con la funcion has_colors()... Y no estas usando nada de esto, entonces no veo de verdad cual es el objetivo de que uses curses y compiles con curses... Tampoco haz inicializado curses, para iniciarlo usas 'initscr()' dentro de la funcion main.


Tu codigo ahora mismo esta como un codigo normal no grafico en C. Si quieres dar uso de las curses tendras que disenar tu ventanita, ponerle colores con has_colors(), asignar los colores a las letritas con init_pair... y olvidarte de funciones tipo (getch, scanf, getchar). O es C puro o es C con ncurses donde deberas implementar otras funciones  :-*

Por cierto en C no grafico y sin curses a mi tampoco me funciona getch. No se exactamente en que header viene getch, pero si se que no viene en stdio.h, ni en los headers estandares de Linux.... sera getch una funcion de conio.h??? conio.h no viene en Linux  :-\ que alguien confirme esto. En tal caso yo suelo usar getchar(); para obtener 1 caracter porke al menos el header que trae getch no se como se llama, y nunca me ha funcionado en Linux tampoco.

Winfuck no se hace uno hombre por tratar de programar en C bajo plataforma Linux. Al menos yo no quiero convertirme en hombre  :-\  y es en Linux y en Unix que tiro lineas de codigo. No voy a volverme hombre por eso espero....
« Última modificación: 14 Mayo 2008, 21:44 por ^TiFa^ » En línea

http://chixmes.blogspot.com/

Si quieres saber el valor del dinero, trata de conseguirlo prestado. 

El que se enorgullece de sus conocimientos es como si estuviera ciego en plena luz.
- Benjamin Franklin.

winfuck

Desconectado Desconectado

Mensajes: 254



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #7 en: 14 Mayo 2008, 22:45 »

No te va a funcionar cielo... sobretodo si estas tratando de usar las curses. Aunque no le veo sentido... puesto que curses usa otras funciones en vez de printf, usamos printw, en vez de scanf usamos scanw en ncurses.... Y tambien usamos los posicionamientos en la pantalla con la funcioncita move, y cerramos la pantalla curses con endwin :)

Tambien se le da color con la funcion has_colors()... Y no estas usando nada de esto, entonces no veo de verdad cual es el objetivo de que uses curses y compiles con curses... Tampoco haz inicializado curses, para iniciarlo usas 'initscr()' dentro de la funcion main.

Tu codigo ahora mismo esta como un codigo normal no grafico en C. Si quieres dar uso de las curses tendras que disenar tu ventanita, ponerle colores con has_colors(), asignar los colores a las letritas con init_pair... y olvidarte de funciones tipo (getch, scanf, getchar). O es C puro o es C con ncurses donde deberas implementar otras funciones  :-*
xD ni lei su codigo, tienes razon este tio no sabe usar la libreria ncurses, pues a leer se ha dicho ;-)

Por cierto en C no grafico y sin curses a mi tampoco me funciona getch. No se exactamente en que header viene getch, pero si se que no viene en stdio.h, ni en los headers estandares de Linux.... sera getch una funcion de conio.h??? conio.h no viene en Linux  :-\ que alguien confirme esto. En tal caso yo suelo usar getchar(); para obtener 1 caracter porke al menos el header que trae getch no se como se llama, y nunca me ha funcionado en Linux tampoco.
cierto,  int getch(void) no es una funcion estandar, pertenece a ncurses, su finalidad es obtener caracteres de la ventana actual creada con la libreria ncurses, que si vamos a la fuente, vemos que no es mas que un macro de wgetch.

ncurses.h
Citar
#define getch()                 wgetch(stdscr)

bueno si bien el conio de borland esta orientado especialmente para plataformas W$, hay una implementacion de conio para usar en linux.
getchar no sirve para lo que el queria, para eso ya le puse el codigo de como hacerlo.

Winfuck no se hace uno hombre por tratar de programar en C bajo plataforma Linux. Al menos yo no quiero convertirme en hombre  :-\  y es en Linux y en Unix que tiro lineas de codigo. No voy a volverme hombre por eso espero....

pues no me agas caso, yo siempre sere 51% troll, asi que simpre saldre con esas boludeces, igual te digo que si veo a una mujer progrmando en C en linux, me gustarias muchisimo mas que si te veo programando en plataformas de codigo cerrado ;-) :P

cya
En línea

|_|0|_|
|_|_|0|
|0|0|0|
Leber

Desconectado Desconectado

Mensajes: 261

"Las estrellas se apagan..."


Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #8 en: 14 Mayo 2008, 23:01 »

Getch, la funcion "getch" propiamente dicha, solo se encuentra en conio.h, libreria (que segun tengo entendido) solo funciona con el compilador de borland.

Segun tengo entendido Ncurses se creo, ademas de los muchos motivos por los que fue, para traspasar segun que funciones del estilo getch(wgetch), gotoxy(move) etc, a un estandart para *nix(ignoro si para otras plataformas).
En línea

"Solo los tontos carecen de preucupaciones." Johann Wolfgang Goethe
^TiFa^

Desconectado Desconectado

Mensajes: 672


Need a Love Loan? Borrow some from me :)


Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #9 en: 14 Mayo 2008, 23:30 »

Pues eso, no me equivoque  ;)  getch es del header conio.h el cual efectivamente NO viene en las Glibc de Linux ni Unix. Es una libreria para Windows.

Aunque existe tambien una libreria o clon o copia no se, de conio.h de windows para Linux, no te lo recomiendo porque se supone que para eso Linux tiene ncurses, que funciona similar a lo que haria conio.h, tambien existe un bindings de ncurses para windows  :D  aunque no lo he probado, no he tirado codigo de C en Windows.
En línea

http://chixmes.blogspot.com/

Si quieres saber el valor del dinero, trata de conseguirlo prestado. 

El que se enorgullece de sus conocimientos es como si estuviera ciego en plena luz.
- Benjamin Franklin.

Eternal Idol N&P

Desconectado Desconectado

Mensajes: 1.340


Assembly (x86/x64), C/C++, Kernel Mode (WDM/WDF)


Ver Perfil WWW
Re: no puedo hacer funcionar getch en linux
« Respuesta #10 en: 14 Mayo 2008, 23:44 »

En línea

http://www.nacionalypopular.com/
http://www.lucheyvuelve.com.ar/

"La economia nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de este"
Juan Domingo Peron
winfuck

Desconectado Desconectado

Mensajes: 254



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #11 en: 14 Mayo 2008, 23:53 »

... aunque no lo he probado, no he tirado codigo de C en Windows.

WOW un pura sangre, yo no puedo decir lo mismo :P

cya
En línea

|_|0|_|
|_|_|0|
|0|0|0|
^TiFa^

Desconectado Desconectado

Mensajes: 672


Need a Love Loan? Borrow some from me :)


Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #12 en: 15 Mayo 2008, 00:07 »

Hay Winfuck....

No vez como me lio sola tirando codigo  :-\ hago cosas que segun no son normales o no aplican  :¬¬. Y no quieras ver un codigo perl mio  :xD  no lo entienden ni los chinos... Pero funcionan  :D

En windows llegue a programar en Visual Basic 6 y Delphi, hace ya uffffffff unos años atras. C es una nueva experiencia para mi  :D y me encanta poder compartirlo bajo Linux.
En línea

http://chixmes.blogspot.com/

Si quieres saber el valor del dinero, trata de conseguirlo prestado. 

El que se enorgullece de sus conocimientos es como si estuviera ciego en plena luz.
- Benjamin Franklin.

winfuck

Desconectado Desconectado

Mensajes: 254



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #13 en: 15 Mayo 2008, 00:20 »

Y no quieras ver un codigo perl mio  :xD  no lo entienden ni los chinos... Pero funcionan  :D
xD paso, ya he tenido que modificar algunos scripts en perl, sabiendo muy poco del lenguaje, no mas que un basico manual, y la verdad que lagunos son inentendibles :S

En windows llegue a programar en Visual Basic 6 y Delphi, hace ya uffffffff unos años atras. C es una nueva experiencia para mi  :D y me encanta poder compartirlo bajo Linux.
:D yo cuando recien empesaba a programar usaba W$ Me :S y programaba en Pascal, BASIC y VB, pero era mas que nada por que me lo pedian en la secundaria, luego de un tiempo pase de W$ Me al mundo del software libre y alli empeso mi amor incondicional hacia este maravilloso lenguaje ;).

cya
En línea

|_|0|_|
|_|_|0|
|0|0|0|
Proxy Lainux

Desconectado Desconectado

Mensajes: 138



Ver Perfil
Re: no puedo hacer funcionar getch en linux
« Respuesta #14 en: 15 Mayo 2008, 08:46 »

hola

perdon... no sabia para que era ncurses y curses, lo que pasa es que cuando escribi en google getch en linux, encontre en algunas paginas que se podia utilizar curses para utilizar getch(), y como al utilizarlo si logre compilar el programa bien, aunke no me funciono, crei que esa libreria era la indicada solo que no sabria como utlizarla... y como dije anteriormente apenas estoy aprendiendo a programar C en linux... jeje  ;D, pero gracias por las respuestas... talvez deberia continuar con los siguientes ejercicios para tener mas experiencia...  y si encuentro algo se los hare saber... gracias  ;D

En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.6 | SMF © 2006-2008, Simple Machines LLC