• Sábado 14 de Diciembre de 2024, 14:48

Autor Tema:  Re: sobre programacion C  (Leído 3696 veces)

wimogan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: sobre programacion C
« en: Miércoles 27 de Noviembre de 2002, 00:28 »
0
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

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
Re: sobre programacion C
« Respuesta #1 en: Miércoles 27 de Noviembre de 2002, 02:22 »
0
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.



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
Solo C que nada C.

wimogan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: sobre programacion C
« Respuesta #2 en: Miércoles 27 de Noviembre de 2002, 17:38 »
0
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.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

adocrates

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
Re: sobre programacion C
« Respuesta #3 en: Miércoles 27 de Noviembre de 2002, 18:40 »
0
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
  1. long EXITKEYS[9]={ F3, ESC, ENTER, ... , -1 };
  2. ...
  3. int getstr(char *buf, int len, int col, int row, ...)
  4. {
  5.     int ind=0,j, c;
  6. ...
  7. //me posiciono en la pantalla
  8. ...
  9.     while(ind < len)
  10.     {
  11.         c=getch();
  12.  
  13.         for(j=0;EXITKEYS[j]!=-1;j++)
  14.         {
  15.             if(EXITKEYS[j]==c)
  16.             {
  17.                 return(c);
  18.             }
  19.         }
  20.         if(isalpha(c) ) // etc
  21.         {
  22.             buf[ind++]=c;
  23.             buf[ind]=0;
  24.         }
  25.     }
  26.     return(0);
  27. }
  28. ...
  29.  
  30. ret=getstr(str_nombre,len_nombre,10,15,...);
  31. if(ret==F3)
  32. {
  33.     finish();
  34. }
  35. ...
  36.  
  37.  

Tb le puedes agregar mascara para formateo, ej input de numero solamente, etc...


Avisa kotejue...


PD. Ta wendy el ejecutable...  promete...:D
Solo C que nada C.

wimogan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: sobre programacion C
« Respuesta #4 en: Jueves 28 de Noviembre de 2002, 06:33 »
0
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.

adocrates

  • Miembro activo
  • **
  • Mensajes: 54
    • Ver Perfil
Re: sobre programacion C
« Respuesta #5 en: Jueves 28 de Noviembre de 2002, 15:17 »
0
Puede que me quede corto con la explicacion, pero la idea es escribir una NUEVA funcion para input de datos, USANDO getch(), que captura codigos de teclas especiales y teclas normales... OK ?

El nombre de la funcion la pones tu, (NO sabia que existia YA una funcion getstr), entonces pongamosle GetString(), que tiene 4 parametros : El buffer donde queda la data, un largo maximo, y para posicionamiento, una columna y una fila :
 
Código: Text
  1. int GetString(char *buf, int len, int col, int row)
  2.  
Quise darte a entender, con los [...] que podias agregar mas parametros, como una mascara de input, para por ejemplo, solo aceptar numeros, eso lo dejo a tu criterio y necesidad.

Ahora, para filtrar las teclas especiales, lease de funciones, flechas y control, declaramos un arreglo long con los codigos de dichas teclas, QUE ESTAN definidos en el .h, ejemplo,  KEY_F(3) [yo le puse F3], KEY_ENTER, y todas las que quieras que interrumpan el input, o para que puedas controlar alguna accion asociada a esa tecla, entendebu?

En el ciclo for, filtramos lo que leimos en la var c, si es tecla especial, retorna el codigo de la tecla, si no es, verificamos que sea una caracter  alfanumerico (A-z,0-9), si es asi lo asignamos al buffer y aumentamos el indice y en la siguiente posicion asignamos 0 que es el caracter de fin de string. Entretanto controlamos que el indice no sobrepase el largo maximo.

Te aconsejo que leas o traduzcas bien los mensajes de error y warnings. Agrega a la compilacion la opcion -Wall y -O3, elimina TODOS los warning y SIEMPRE estaras seguro que tu aplicacion esta Wendy...

Salu2.


PD: Este foro tiene un chat vacio, si quieres, avisame una hora y parlamentamos live...
No estaria demas que publicaras el codigo para cachurearlo...:D
Solo C que nada C.

wimogan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: sobre programacion C
« Respuesta #6 en: Jueves 28 de Noviembre de 2002, 23:31 »
0
Adocrates:

Recibi tu ultima respuesta la analice y crei entender lo que me decias, por lo que empece un nuevo codigo mas pequeño parecido al codigo original del ejecutable que te mande y al parecer no entendi, porque no obtuve los resultados.

Sorry!.

Bueno, en fin aqui te envio ambos codigos, el original de mi programa y el de prueba que incluye la idea que me diste, para que lo analices y lo modifiques tu mismo y me puedas ayudar.

El archivo linux.c lo compilas con "-lncurses -lform" y el archivo ncurses.c lo compilas con "-lncurses".

Nota: En el original "linux.c" hay lineas que pueden estar demas y que se podrian eliminar si logro resolver el problema de la lectura. Revisalo tu mismo y veras todo lo que he tenido que hacer para lograr algunas cosas y te daras cuenta de a que me refiero.

Na' espero tu respuesta.

Ariel.


Modifique este mensaje y borre el codigo del programa porque creo que me confundi de codigo al enviarlo, ya que no estaba posteado el mas actual, el cual luego posteare para ver que me dices y en que me puedes ayudar. "Me interesa que me ayudes con ese".

Por ahora solo deje algo sencillo usando la idea que me diste!.

Ariel.

wimogan

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
sobre programacion C
« Respuesta #7 en: Jueves 28 de Noviembre de 2002, 23:42 »
0
Aqui va el segundo archivo:


Ah, quiero que el primero lo revises bien y me des algunas recomendaciones y mejoras que consideres de lugar imaginandote que vas a ser un usuario de ese programita, que cosas te gustaria que tuviera y en cuanto al codigo, cuales mejoras sugieres.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.