Posteado por: wozgeass | septiembre 13, 2009

C con Ncurse.


Este capitulo los inicio en la programacion con ncurses.

Iniciemos . . .

Como instalar:

Gentoo:

emerge ncurses

Debian:

apt-get install libncurses5

Ubuntu:

apt-get install libncurses5

En otras distros tan solo falta buscar el nombre completo para instalarlo.

¿Curses o Ncurses?
La libreria Curses ah estado en Unix desde antes de 1980. Fue siempre una parte de la version de Unix que requeria de una licencia para ser usada.
Ncurses es una nueva libreria creada a partir de la original Curses, bajo la licencia de GPL.

#include<ncurses.h> //libreria

main(){

initscr();  //inicia el modo ncurse

addstr(“hola mundo!”); //funcion que escribe en pantall la cadena

refresh();

sleep(2);

endwin();  //termina el modo ncurses

return(0);

}

Ahora como compilar este programa:

gcc -o <nombre_ejecutable>  <nombre_codigofuente.c>  -l  ncurses

En tu terminal ejecuta lo:

./<nombre_ejecutable>

La funcion initscr(); Inicializa el modo Ncurses. No limpia la terminal. En su lugar, establece estructuras de memoria interna y las interfaces entre las funciones de ncurses y la terminal.
Un par de cosas importantes sobre initscr(), conforman la pantala estandar y la pantalla actual. Ambas estructuras son utilizadas para mostrar informacion eficientemente en la pantalla de la terminal.
La pantalla estandar o stdscr, es la ventana de salida por defecto, es la ventana principal que vamos a usar, y es exactamente del mismo tamaño que la pantalla de la terminal. La funcion initscr() crea la pantalla estandar y utiliza la variable stdscr para crearla.
La funcion refresh() actualiza la pantall estandar (stdscr), que actualiza lo que se muestra al usuario.
Al igual que la pantalla estandar, la pantall actual es una ventana ncurses. Pero a diferencia de la pantalla estandar (stdscr), es poco frecuente(y no recomendado) a la salida directamente a curscr. Hay muchas razones, que aprenderemos mas adelante.
Ademas de la pantalla estandar y pantalla actual hay algo llamdo pantalla virtual. La pantalla virtual existe por motivos de eficiencia. Contiene informacion actualizada, solo los elementos modificados o que una determinada ventana este esperando para ser actualizada en la pantalla estandar(stdscr).
Internamente, la funcion refresh() consite en 2 subfunciones. La primera es wnoutrefresh(), que solo actualiza las porciones de una ventana o pantalla estandar a la pantalla virtual. La segunda mitad de de la funcion de refresh() es doupdate(), que hace que la pantalla estandar, iguale el contenido de las actualizaciones de la pantalla virtual. De nuevo, esto se hace para mantener la produccion de texo eficiente. Las otras maneras serian actualizar la pantalla de la terminal completamente cada vez que el nuevo texto es puesto en el buffer de salida(stdout), lo que puede ser terriblemente lento en algunos ordenadores.
Toda esta terminologia(pantalla estandar<stdscr>, la pantalla actual<curscr>, la pantalla virtual, wnotrefresh() y doupdate()) pude ser abrumadora no te asustes, son solo los mecanismos internos por los que ncurse trabaja.

Para lo que empiezan, es facil de recordar que initscr() es la funcion que inicializa ncurses para su codigo.
Pero initsrc() no esta sola, tiene una funcion gemela llamada newterm().
La funcion newterm() configura ncurses como initscr() lo hace, pero permite un mayor control sobre la entrada y las fuentes de salida. Por lo tanto es una especie de funcion avanzada.
Y te preguntaras ¿si una funcion inicia el modo ncurse debe existir una que lo termine?, pues esta funcion se llama endwin(), Deshace las modificaciones que ncurses ha hecho a su terminal, y hace otras depuraciones en la terminal.

Es muy importante que termines el programa usando la libreria ncurses con la funcion endwin(), ya que si se te olvida el comportamiento de la terminal se vuelve impredecible. Asi que se muy cuidadoso cuando tu programa es un monstruo y tiene varias salidas.
Ten en cuenta que las funciones estandar de salida de C putc(), puts(), printf() producen una salida de texto  cuando Ncurses esta activo, aunque el hacerlo confundiriamos a Ncurses acerca de lo que esta en la pantalla. Por lo que es mejor no utilizarlas mientras ncurses este dando como salida texto usando funciones propias de la libreria.
Por cierto, endwin() no tiene que ser el final de tu programa. Es posible utilizar endwin() a la mera suspesion de ncurses y regresar a la terminal. Cuando la funcion refresh() es usada despues de endwin(), se reactiva el modo ncurses visual, aunque todavia se debe utilizar otro endwin() para finalizar correctamente el programa.
Cuando initscr() se ejecuta, a todos los espacios en blanco y pone el cursor a la posicion inicial, fila superior, columna izquierda. La funcion refresh() actualiza la pantalla estandar(stdscr) y es desplegada en la pantalla de la terminal.

Entrada/salida de texto.

Tenemos 3 populares funciones de salida de texto:

addch();
addstr();
printw();

La funcion addch() es una funcion que agrega un caracter a la pantalla.
La funcion addstr() agrega la cadena completa, en escencia llamando a addch() podemos completar una cadena, es similar a putc() aun que el salto de linea ‘\n’ no se añade.
De seguro ya te diste cuenta de la copia de la funcion printf(), en ncurse se llama printw() que hace lo mismo que su funcion clon.

#include  <ncurses.h>
int main(void)
{
char texto[] = “Saludos usando Ncurses”;
char *t;
initscr();            //iniciamos el modo ncurses
t = texto;
while(*t)
{

addch(*t);       /* imprimimos un caracter en la pantalla estandar
t++;
refresh();
napms(100);      //espero milisegundos*/
}
getch();
endwin();           //termino modo ncurses
return (0);
}

La funcion napms() detiene la ejecucion del programa milisegundos, un ejemplo de como usarla seria:
napms(100);

#include  <ncurses.h>
int main(void)
{
char texto[] = “cadena original!\n”;
char texto1[] = “cadena clon!”;
initscr();
addstr(text0);    //imprime la primer cadena

namps(100); //espera 100 milisegundos para
addstr(text01);    //imprime la segunda cadena
refresh();        // Actualiza la pantalla estandar
getch();        //espera a que tecles algo
endwin();
return 0;
}

La funcion move() mueve el cursor en las cordenadas que se le pasen al funcion en la pantalla estandar(stdscr):
move(y,x); donde ‘y’ es la fila y ‘x‘ es la columna.
No hay nada complejo en la escritura de texto en la pantalla estandar. La funcion move() es interezante para poner texto en la posicion que deseemos. En C tenemos funciones que nos permiten la lectura de texto  por el teclado, ncurses tambien tiene las propias:

getch();
getstr();
getnstr();
scanw()
;

La funcion getch() devuelve un caracter unico de la consola. No es necesario pulsar la tecla <enter>, porque se lee inmediatamente.
La funcion getstr() y getnstr() leen una cadena de texto desde la consola, getnstr() funciona de la siguiente manera:

getnstr(cadena, tamaño); // donde tamaño es el numero de carateres que leera.


La funcion
scanw() es lo equivalente al scanf () de Ansi C, una entrada con formato.

#include <ncurses.h>
#define UNI 32.0
int main(void){
int pieces;
initscr();
addstr(“BARRA DE CAGUAMAS”);
move(3,0);
printw(“LA PIEZA CUESTA HOY $%.2f.\n”,UNI);
addstr(“Cuantas piezas quieres? “);
refresh();
scanw(“%d”,&pieces);
printw(“Elegiste %d piezas?\n”,pieces);
printw(“Debes pagar:: $%.2f!”,UNI*(float)pieces);
refresh();
getch();
endwin();
return 0;
}

wozgeass: push eax, 1

int 80h

EOF!!!

hasta el proximo post…

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: