Programación General > C/C++
Re: sobre programacion C
wimogan:
Un saludo cordial a todos:
Estoy escribiendo un programa en lenguaje C y estoy usando Ncurses y ya tengo diseñada las pantallas necesarias, pero.......
Mi problema es que quisiera leer cualquier tecla de funcion o un valor numerico, segun sea el deseo del usuario, con un mismo comando de lectura; es decir, supongamos que tengo un letrero que diga: "Digite cantidad de articulos: " y al final de la pantalla otro que diga: "F3=Salir". Lo que quiero es que el usuario sea quien elija si quiere digitar la cantidad de articulos o salir del programa.
Si alguien me puede dar una idea de como lo puedo hacer con un mismo comando de lectura para que se acumule en una sola variable o una idea de como crear una funcion que lo lea como hasta ahora lo estoy haciendo "usando getch" y los pase a una sola variable.
Le estare muy agradecido en el alma!.
Ah, ademas cualquier cosa que alguien necesite saber sobre el uso de Ncurses, me puede hacer preguntas y segun mi capacidad, les respondere.
Atte. Ariel.
adocrates:
No sabia de ncurses, busque y encontre un manual que dice :
--- Citar ---Entrada (Input)
La función complementaria de addch() es getch() que, si el eco esta activo, llamara a addch() para sacar el carácter por pantalla. Por ello el terminal necesita saber que hay en el terminal a todas horas, si los caracteres están siendo sacados por pantalla, el tty debe estar en modo crudo o cocinado (cbreak). Por ello inicialmente el terminal ha activado el eco y esta en modo cocinado, uno o el otro ha sido cambiado antes de llamar a getch(); de otro modo, la salida del programa será impredecible
Cuando necesita aceptar una línea orientada a la entrada en una ventana, las funciones wgetstr() y semejantes están disponibles. Hay incluso una función wscanw() que puede hacer scanf()(3)- estilo de análisis multi-campo en la entrada de la ventana. Estas funciones pseudo-lineas-orientadas activan el eco mientras se ejecutan.
El código ejemplo anterior utiliza la llamada a keypad(stdscr, TRUE) para permitir el soporte de mapeado de teclas-funciones. Con esta característica, el código getch() ve el flujo de entrada como secuencias de caracteres que corresponden a flechas y teclas de funciones. Estas secuencias son devueltas como valores pseudo-carácter. Los valores de #define devueltos son escuchados en la curses.h. El mapeo de secuencias a valores #define es determinado mediante capacidades de teclas en la correspondiente entrada del terminal de información.
--- Fin de la cita ---
Asi que mira el curses.h, revisa la funcion, hace un programita que testee las teclas, identifica la que quieres controlar y avisa como te fue...:D
wimogan:
Hola a todos de nuevo:
Adocrates, gracias por animarte a responderme, de veras gracias.
Con respecto a lo que me recomendaste de hacer un programita que testee las teclas, en mi programa yo puedo saber cuando un usuario pulsa "F3" y hago que el programa termine cuando el usuario la pulsa. Pero ese no es el punto, ya que esa parte yo la supe hacer desde el principio.
Mi verdadero problema es que eso me trae, valga la redundancia, otro problema; ya que solo puedo leer un solo caracter en ese momento en el programa y no una cadena de caracteres que es lo que yo quiero.
Para ser mas explicito:
1-) Si hago la lectura con "getch" o "wgetch", esos comandos solo me aceptan un caracter por cada pulsacion e inmediatamente procesan la lectura. Mira mas o menos lo que quiero hacer:
int resp;
mvwprintw(win1,1,1,"Digite cantidad de
articulos: ");
mvwprintw(win1,10,1,"F3=Salir");
while((resp=wgetch) != KEY_F(3))
{
/*Lo que deseo hacer. Ejemplo:*/
case KEY_ENTER: /*Tal cosa*/;break;
case KEY_DOWN: /*Tal cosa*/;break;
case /*Etcetera*/: /*Etcetera*/;break;
default: /*En esta parte el programa
debe saber que se va a
trabajar con "1234"
articulos, como un decir*/;
}
finish(0); /*Llamada a esa funcion para
finalizar el programa*/
En ese caso, si el usuario pulsa "F3", el cuerpo del "while" no se ejecuta y el programa pasa a la llamada de la funcion "finish" y finaliza, en caso contrario si el usuario digita el numero "1234" y tengo definido un campo de enteros de solo 4 caracteres, la variable "resp" solo me acumularia un "4" al final del campo y no el "1234" poque cuando pulso el 1 "resp=1", cuando pulso el 2 "resp=2", cuando pulso el 3 "resp=3", y cuando pulse el 4 "resp=4" (valor final en el campo de solo 4 enteros). Ese es en realidad mi problema y hasta ahora solo conosco los derivados de "getch" para poder leer las teclas de funciones.
2-) Si hago la lectura con "scanw" o "wscanw", esos comandos si me aceptan una cadena de caracteres y esperan por un enter para procesar la lectura, pero si pulso una tecla de funcion "F3", como es mi caso; para "scanw" o "wscanw" eso no significa nada y no pueden leer esa tecla.
Bien para que alguien o tu "adocrates" me pueda ayudar en la solucion de mi problema de la manera en que estoy haciendo el programa o me puede decir otra forma de hacer lo que quiero, habra en este documento el dato adjunto de mi programa objeto compilado para "Linux" y hasta donde lo he trabajado. No envio el codigo fuente porque en estos momentos no lo tengo a mano, estoy en el trabajo y solo traje el programa objeto para mostrarselo a mi jefe.
De nuevo gracias y en espera de mas y nuevas ayudas y recordando mi dispocision para ayudar segun mi capacidad a quien me necesite.....
Ariel.
adocrates:
Ariel, es mas simple de lo que piensas, tienes que substraer el codigo un nivel mas (esto es estilo de programacion bottom-up), o sea poner una funcion entremedio.
Tienes que hacer una funcion que lea un string y retorne, por ejemplo, 0 ok, F3, etc... y luego controlar que hacer (en codigo pulento, que funca solo en teoria... ) :
--- Código: Text ---long EXITKEYS[9]={ F3, ESC, ENTER, ... , -1 };...int getstr(char *buf, int len, int col, int row, ...){ int ind=0,j, c;...//me posiciono en la pantalla... while(ind < len) { c=getch(); for(j=0;EXITKEYS[j]!=-1;j++) { if(EXITKEYS[j]==c) { return(c); } } if(isalpha(c) ) // etc { buf[ind++]=c; buf[ind]=0; } } return(0);}... ret=getstr(str_nombre,len_nombre,10,15,...);if(ret==F3){ finish();}...
Tb le puedes agregar mascara para formateo, ej input de numero solamente, etc...
Avisa kotejue...
PD. Ta wendy el ejecutable... promete...:D
wimogan:
Adocrates, antes que nada, vuelvo a agradecerte por las atenciones brindadas de tu parte y de ante mano tambien hacerte saber, que soy bastante nuevo en este asunto de la programacion C. Considero que conosco muy poco de programacion C tomando en cuenta lo extenso y poderoso que es ese lenguaje de programacion, asi que:
Si no es mucha molestia, me gustaria que me explicaras paso a paso cuales son los objetivos de algunas lineas de la parte del codigo que me enviaste, por ejemplo:
int getstr(char *buf, int len, int col, int row, ...)
Que buscas con esa parte del codigo, porque supongo que quieres declarar una funcion de tipo entero llamada "getstr" con su cuerpo debajo y de ser asi, quiero recordarte que esa funcion ya existe en la libreria "ncurses.h" que es un enlase simbolico de la "curses.h", por lo que al compilar usando "getstr" de ese modo, obtengo el error: macro `getstr' used with too many (4) args ; dejandome por entendido que estoy usando demasiado argumentos para "getstr", en este caso 4 argumentos quitandole los puntos suspensivos.
En otra parte que quisiera saber que funcion realizan esas lineas es:
buf[ind++]=c;
buf[ind]=0;
Mas o menos entiendo tu idea si estas tratando de crear la funcion "getstr", pero tengo errores al compilar el codigo. De hecho, considerando que vas por el lado de la funcion, trate de darle un nombre diferente a la misma: "getst" y en ese caso obtuve mas lineas de errores, entre ellas:
`F3' undeclared (fist use in this function)
diciendome que la variable F3 no esta declarada.
Por causa de entendimiento y de los errores que obtengo al compilar, me gustaria que dentro de tus posibilidades, me expliques linea por linea lo que quieres en cada parte del codigo, aunque no quiere decir que no entienda ninguna de ellas.
En realidad tengo la esperanza de entender mas sobre programacion C dentro de unos dias o meses, ya que nunca he dado programacion C y lo poquito que he aprendido, lo he aprendido leyendo y bajando manuales en ingles y español de internet. El ciclo que viene me toca programacion II en la Uni y es en lenguaje C, que me puede ayudar mucho, pero mientras si sabes de algun libro bueno para principiantes como yo o de algun manual que pueda obtener para seguir aprendiendo, tambien bienvenido sea.
Me gusta mucho la programacion C y pienso hacer algunos proyectos bajo ese lenguaje.
Ah, una ultima cosa, mi email es:
wimogan@hotmail.com por si deseas enviarme cualquier cosa y escribeme el tuyo en caso de que nesecite enviarte cualquier cosa y para enviarte el codigo fuente de mi programa para que lo revises y me puedas ayudar mejor.
Bueno, me despido agradeciendote de nuevo y esperando ser un buen programador en C y estar a tu nivel.
Ariel.
Navegación
[#] Página Siguiente
Ir a la versión completa