elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 80
81  Programación / Programación C/C++ / Re: ayuda con kbhit() en: 19 Mayo 2012, 19:39 pm
Hola.

Bueno, hacia bastante tiempo no tocaba a ncurses, buscando un poco he encontrado un ejemplo en StackOverflow que emula la función kbhit() y como veo que no conoces aun ncurses, pues paso a explicar el ejemplo:

Código
  1. #include <ncurses.h>
  2. #include <unistd.h>  /* only for sleep() */
  3.  
  4. int kbhit(void)
  5. {
  6.    int ch = getch();
  7.  
  8.    if (ch != ERR) {
  9.        ungetch(ch);
  10.        return 1;
  11.    } else {
  12.        return 0;
  13.    }
  14. }
  15.  
  16. int main(void)
  17. {
  18.    initscr();
  19.  
  20.    cbreak();
  21.    noecho();
  22.    nodelay(stdscr, TRUE);
  23.  
  24.    scrollok(stdscr, TRUE);
  25.    while (1) {
  26.        if (kbhit()) {
  27.            printw("Key pressed! It was: %d\n", getch());
  28.            refresh();
  29.        } else {
  30.            printw("No key pressed yet...\n");
  31.            refresh();
  32.            sleep(1);
  33.        }
  34.    }
  35. }

El principio del programa:
Código
  1. #include <ncurses.h>
  2. #include <unistd.h>  /* only for sleep() */
incluimos como no ncurses que es la que nos va a permitir interactuar y generar respuesta a las acciones del teclado. Incluimos también unistd que nos da accceso a la API POSIX del sistema, aunque en este caso solo vamos usar como se ve en el omentario la función sleep()

Bueno, empecemos por la función main antes de ir a la función kbhit:

Código
  1. initscr();
Esta función es la que va a inicializar el modo curses ni no llamamos a esta función no podremos usar el resto de ncurses.

Código
  1. cbreak();
Esta función deshabilita el "line buffering" del terminal, lo que quiere decir que no es necesario hacer retorno de carro o tener un caracter de nueva linea al final, sino que los caracteres que tipeamos en el teclado son enviados directamente.

Código
  1. noecho();
esta función deshabilita el "eco" del terminal, lo que significa que los caracteres que se ingresan no son mostrados, similar a cuando se ingresa una contraseña desde la terminal.

Código
  1. nodelay(stdscr, TRUE);
esta función convierte a la función getch() en una llamada no bloqueante, lo que quiere decir que cuando se usa getch() el programa no se va a parar a esperar a que el usuario ingrese algo, si no se ingresa nada entonces la función devuelve ERR y si se ingresa algo entonces almacena el código de la tecla que fue ingresada. Esta función acepta dos parámetros stdscr y la representación de un booleano (TRUE o FALSE). Verás cuando se trabaja con ncurses se usa el concepto de WINDOWS que no son nada más que espacios independientes en donde se puede disponer de la información que queramos que el usuario conozca, igualmente podemos cerrar eliminar o crear nuevas WINDOW. por defecto ncurses establece que la ventana principal es stdscr. Entonces en definitiva lo que hacemos con la función es decir que queremos que getch no sea bloqueante unicamente en stdscr si tuviéramos otras WINDOWS no serian afectadas por esta función, y por supuesto para deshabilitar con un simple nodelay(stdscr, FALSE).

Código
  1. scrollok(stdscr, TRUE);
VA a evitar que se presente scroll fuera de los limites del tamaño actual de la terminal, osea que verás que el buffer de lo que se muestra en pantalla no se almacena y nunca habrá scroll, como lo explique antes esto se aplica a stdscr y para deshabilitar con scrollok(stdscr, FALSE);

Antes de continuar a revisar el loop revisemos la función kbhit:
Código
  1. int kbhit(void)
  2. {
  3.    int ch = getch();
  4.  
  5.    if (ch != ERR) {
  6.        ungetch(ch);
  7.        return 1;
  8.    } else {
  9.        return 0;
  10.    }
  11. }
  12.  
Entonces vemos que es una función que retorna un entero, en este caso 1 o 0 y no recibe ningún parámetro. Estamos almacenando lo que retorna getch() en ch, para el momento en el que llamemos a kbhit() getch no debería ser bloqueante. comprobamos si ch es diferente de ERR, entonces se habrá producido una pulsación, pero cuando llamamos a getch el código de la tecla habrá sido sacada de la cola de entrada, lo cual es un problema, así que para devolverla hacemos un ungetch(ch), así la próxima vez que llamemos a getch() nos devolvera el código de la tecla que estaba en ch. Si recibimos ERR no habrá pulsación alguna y retornamos 0.

Ahora al bucle:
Código
  1. while (1) {
  2.        if (kbhit()) {
  3.            printw("Key pressed! It was: %d\n", getch());
  4.            refresh();
  5.        } else {
  6.            printw("No key pressed yet...\n");
  7.            refresh();
  8.            sleep(1);
  9.        }
  10.    }
  11.  

Entonces comenzamos un bucle infinito, y probamos el retorno de kbhit, si kbhit retorna 1 entonces habrá una pulsación, imprimimos que se ha presentado una pulsación y obtenemos el código que estará en getch() (gracias a ungetch()), así si presionamos la tecla 'a' por ejemplo tendremos una salida como la siguiente:
Citar
Key pressed! It was: 97
donde 97 es el código ASCII de 'a'

Si kbhit devuelve 0 entonces no habrá pulsación y tendremos una salida como la siguiente:
Citar
No key pressed yet...

Código
  1. refresh()
ncurses nos permite reducir la latencia del terminal. Si queremos que los cambios que hemos hecho se muestren por pantalla es neesario usar refresh, si no lo hacemos no se mostrará ningún cambio que se haya producido (en este caso en stdscr).

Código
  1. sleep(1)
finalmente para poder ver que es lo que estamos haciendo, y no tener un loop loco en la pantalla dormimos el programa por 1 segundo, tiempo más que suficiente para ver que es lo que sucede.

Ahora creo que estás en ubuntu, así que lo primero es instalar la librería ncurses para desarrollo y si no estoy mal sería:
Código
  1. sudo apt-get install ncurses-dev

Luego para compilar usamos el siguiente comando:
Código
  1. gcc code.c -o code -lncurses

y para ejecutar y ver el resultado:
Código
  1. ./code

Espero haya sido de ayuda.

Saludos
82  Programación / Java / Re: ORDENACION DE NOTAS POR FECHAS EN JAVA. en: 19 Mayo 2012, 17:38 pm
No has leido acaso mi mensaje? -.-! en el encontrarás toda la información necesaria de como usar foreach que es como se le denomina a lo que tu llamas "la variable intermedia for". Mira, al menos muéstranos la clase entera dentro de sus respectivas etiquetas GeSHi para saber como construir correctamente el bloque del foreach. mientras tanto y por si no lo viste, pues te cito mi mensaje anterior:

Ese bucle foreach no se usa así. La forma correcta *concreta en  Este caso debería ser:

Código
  1. for( LIBRETA lib : Libreta ) {
  2.    if ( lib.NotaEnLibreta(NOTA1) )
  3.    /*Resto del código*/
  4. }
  5.  
Donde "Libreta" tiene que ser de tipo "LIBRETA". y "LIBRETA" ha deser un array o una colección
Aquí encontrarás más información de como usar foreach: http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

Ahora te recomiendo que leas esto: http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html y lo pongás en práctica, así es más fácil para las otras personas, y seguramente más tarde para ti también leer el código que escribes.

* Suponiendo que esos son los objetos que usas ya que no conozco la totalidad de la clase

Saludos

Espero sea de ayuda.

Saludos
83  Programación / Programación C/C++ / Re: Problema con librería vector. en: 19 Mayo 2012, 04:20 am
Código
  1. vec.push_back(texto)

Refrencia de <vector>

Saludos
84  Sistemas Operativos / GNU/Linux / Re: Pascal para Linux en: 19 Mayo 2012, 04:13 am
Tal vez GNU Pascal: http://www.gnu-pascal.de/gpc/h-index.html

Saludos
85  Programación / Programación C/C++ / Re: Recompilar en Borland C 4.5 DOS en: 18 Mayo 2012, 21:39 pm
Jajajajaj vamos que no tienes que compensar a nadie! para eso está la comunidad. En todo caso porque no lo subes a algún lado pasas el link a ver si la gente se anima a ver que conflictos puede encontrar.

Saludos
86  Sistemas Operativos / GNU/Linux / Re: como abro un archivo lzm en: 18 Mayo 2012, 18:55 pm
Bueno de acuerdo a otro post que el publico despues de este, asumo ue este problema ya está resuelto.

Saludos
87  Programación / Programación C/C++ / Re: Separar string Ayuda en: 18 Mayo 2012, 18:52 pm
Bien, me alegro que haya sido de ayuda.

Saludos
88  Programación / Programación C/C++ / Re: I want a cookie en: 18 Mayo 2012, 16:38 pm
Bueno lo que quieres hacer lo veo algo difícil, pero en todo caso tal vez quieras investigar acerca de las librerías ncurses.

Saludos.
89  Programación / Programación C/C++ / Re: Separar string Ayuda en: 18 Mayo 2012, 05:30 am
Claro que si lo está! XD bueno pues si lo copias es entendible que se te haya pasado =D, en C++ se puede encontrar bajo <cstring>

Saludos
90  Programación / Programación C/C++ / Re: Separar string Ayuda en: 18 Mayo 2012, 04:35 am
durasno como se mencionó antes strok() no hace parte de <string> y al compilar dará error:

Citar
error: ‘strtok’ no se declaró en este ámbito

Se debe incluir <cstring> o <string.h> y esta última no pertenece a la librería estándar de C++

Saludos
Páginas: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ... 80
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines