Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: DCelso on August 17, 2008, 11:49:59 AM

Title: Lectura de cadenas formateadas
Post by: DCelso on August 17, 2008, 11:49:59 AM
Hola a todos, estoy haciendo un cliente en fenix (puesto que para bennugdwip2 no encontré la network.dll) y necesito funciones sscanf y sprintf para poder leer y enviar los mensajes entre el cliente y el servidor. Resulta que no encuentro funciones análogas en fenix tipo como seria en C :sscanf(mensaje,"%s %d", comando,& valor)
Si no existe,¿sería facil de hacer algun port en dll o se os ocurre alguna otra forma de leer de un mensaje (tipo string) una cadena de longitud variable seguida de un espacio y seguida de un número de longitud variable?
Gracias de antemano
Title: Re: Lectura de cadenas formateadas
Post by: animanegra on August 17, 2008, 12:15:30 PM
Si estas rehaciendo la network ¿porque no usas el propio c y le das a fenix las variables ya troceadas? Es decir, estas haciendo la libreria en c para usarla en bennu ¿no?
Title: Re: Lectura de cadenas formateadas
Post by: DCelso on August 17, 2008, 02:03:47 PM
No, estoy usando fenix y network.dll para hacer un cliente que se conectará a un servidor que me devuelve ese tipo de mensajes.
No he hecho ninguna dll propia, simplemente uso la network en mi desarrollo.
Title: Re: Lectura de cadenas formateadas
Post by: SplinterGU on August 17, 2008, 04:09:25 PM
No te recomiendo pensar en usar sscanf o sprintf, ya que son consumidoras de tiempo, por otro lado, argumentos variables no son soportados en Bennu, por ende hacer una funcion de este estilo no es posible...
Pero si lo que necesitas es hacer un parseador, podes usar SPLIT, para dividir el mensaje en palabras que podes ir interpretando.
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on October 21, 2008, 09:20:31 PM
Ahora mismo estoy con Fenix intentando leer las lineas de un fichero de texto donde se encuentran los valores de daño y nombres de algunas armas, linea a linea. Está editado a mano con el Bloc de notas de Windows y tengo un problema análogo:

En primer lugar fgets(); no me lee una linea completa, es decir, nunca llega al salto de linea y deja de leer cuando encuentra cualquier caracter no numérico.

En segundo lugar he usado file(); para obtener el texto completo del fichero, pero en mi documentación de Fenix no veo funciones para "cortar" strings.

¿Ese SPLIT del que hablas sirve para eso?, ¿También está en Fenix?, ¿Dónde puedo encontrar su descripción?

Es eso o crearme una librería propia para cadenas... Y esas cosas no gustan :(
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on October 21, 2008, 09:28:17 PM
Rectifico!

Sí, split() está en mi documentación de Fenix, la había dejado a un lado porque esperaba encontrar algo mejor, pero me sirve al menos para cerrar el módulo que carga datos desde fichero. Ahora sólo tengo que separar y con atoi() ya está todo listo. Este foro es la kaña!
Title: Re: Lectura de cadenas formateadas
Post by: TYCO on October 21, 2008, 11:02:05 PM
Pásate por las Wiki donde están la mayoría de las funciones y variables (locales y globales):

Bennu Wiki (http://wiki.bennugd.org/index.php?title=Bennu_Wiki)
Fenix Wiki (http://fenixworld.se32.com/fenixwiki/index.php?title=Portada)

Las dos Wiki contienen funciones y variables funcionales en Bennu.

FGETS (INT fichero)

FGETS lee una cadena de texto de un fichero y la devuelve como una STRING, ideal para leer ficheros de texto, sobre todo si estos se han creado mediante el comando FPUTS. El texto no debe medir más de 1024 caracteres. En dicha cadena se incluye el caracter 10 al final para indicar el fin de la linea, pero si se ha hecho con el bloc de notas de windows se añade además el caracter 13 (retorno de carro), es por eso que, a la hora de almacenar todo el texto, se suele tomar la cadena devuelta entera salvo los dos últimos caracteres (consultar el uso de SUBSTR).

Yo uso sin problemas las funciones FPUTS y FGETS sin problema alguno, siempre conjuntamente. No hago uso de FGETS para leer un archivo de texto sacado de vete a saber donde, no se si ese será tu problema.
Title: Re: Lectura de cadenas formateadas
Post by: SplinterGU on October 22, 2008, 01:28:22 AM
En fenix puede tener problemas, te sugiero te pases a Bennu... por lo menos asi te podemos dar un soporte mas realista... saludos...
Title: Re: Lectura de cadenas formateadas
Post by: Drumpi on October 22, 2008, 05:56:25 PM
Bueno, yo he usado ficheros en Fenix sin ningun problema, ni siquiera el que se comenta de fgets.
Jejeje, esa documentación de FGETS me suena mucho :P Aunque creo que hay que hacer alguna modificación, porque en una de las últimas versiones creo recordar que terminó suprimiéndose el chr(10) de lo leido con fgets.

Y tengo que comprobar un detalle curioso de la 083b, a ver si se repite en las posteriores, que si uso substr en donde empieza un número, me toma los siguientes caracteres numéricos (por ejemplo, con substr(mi_cadena,10,10) me ha leido la cadena "328").
Son este tipo de cosas las que me hacen, cada día más, crearme mis propias funciones :P
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on October 22, 2008, 06:30:10 PM
Probablemente el problema es que usaba fgets(); en un fichero editado "a mano", sin fputs();

No problem, split(); me está dando buen resultado y seguiré usándolo.

Y lo de pasarme a Bennu definitivamente... Espera que lea un par de consultas que tengo hechas en el foro sobre Bennú y me lo pensaré, estoy en ello xD

Gracias!
Title: Re: Lectura de cadenas formateadas
Post by: SplinterGU on October 22, 2008, 06:31:01 PM
Mas que crearte nuevas funciones lo que deberias hacer es reportar los errores para poder corregir el lenguaje...
Pero el modulo de strings fue revisado y corregido totalmente... por lo menos eso creo...
Title: Re: Lectura de cadenas formateadas
Post by: SplinterGU on October 22, 2008, 06:31:49 PM
Quote from: Windgate on October 22, 2008, 06:30:10 PM
Probablemente el problema es que usaba fgets(); en un fichero editado "a mano", sin fputs();

No problem, split(); me está dando buen resultado y seguiré usándolo.

Y lo de pasarme a Bennu definitivamente... Espera que lea un par de consultas que tengo hechas en el foro sobre Bennú y me lo pensaré, estoy en ello xD

Gracias!

No tiene importancia hacias editado el archivo a mano o no, mientras en cada linea le hayas dado enter...
Title: Re: Lectura de cadenas formateadas
Post by: Drumpi on October 26, 2008, 01:08:52 AM
Quote from: SplinterGU on October 22, 2008, 06:31:01 PM
Mas que crearte nuevas funciones lo que deberias hacer es reportar los errores para poder corregir el lenguaje...
Pero el modulo de strings fue revisado y corregido totalmente... por lo menos eso creo...

Es que creo que no es un error, es que funciona así (de hecho, creo recordar que C hace lo mismo) y creo que después dejó de trabajar de esa forma. No se, yo es que soy un maniático del control, y que una función use una "feature" que no está documentada me fastidia.
Pero no le des vueltas al asunto, aun era joven, no sabía lo que hacía, y hoy me va a tocar retocar el código de nuevo, y de paso, mejorarlo ;)
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on October 26, 2008, 04:30:28 PM
Estoy portando el juego a Bennu porque definitivamente fgets(); y split(); no me funcionan correctamente en Fenix (Meten un 0 en la cadena...).

El compilador de Bennu se me queja porque no conoce la función split(); ¿Qué librería debo incluír? Ahora mismo tengo estos define, copiados directamente de otro juego en Bennu:

#ifndef __VERSION__
//    import "bgdi";
    import "mod_sdlevthandler";
#else
    import "mod_say";
    import "mod_wm";
    import "libwm";
    import "mod_video";
    import "mod_map";
    import "libmouse";
    import "mod_text";
#endif

#ifdef COMPILER_VERSION
    import "mod_key";
    import "mod_string";
    import "mod_file";
    import "mod_mem";
    import "mod_proc";
    import "mod_time";
#endif
Title: Re: Lectura de cadenas formateadas
Post by: SplinterGU on October 26, 2008, 04:38:40 PM
mod_regex

fijate que hay un archivo function-list.txt o algo asi... donde describe cada modulo y que funciones contiene...

saludos.
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on July 20, 2009, 05:46:44 PM
Resucito este hilo tras casi medio año... Veo que incluso tengo aquí varios mensajes escritos de cuando todavía usaba Fénix :o :o :o

La cuestión es que me gustaría poder usar un único write() de forma que en el texto a escribir pueda incluir algunos saltos de linea. Me explico con un ejemplo muy sencillo:

Me gustaría que con:
   write(0,0,0,0, "Hola" + CONST_SALTO_LINEA + "que" + CONST_SALTO_LINEA + "tal?");

Obtenga esta salida en pantalla:
   Hola
   que
   tal

He probado con /n con / con \ con itoa(10) con itoa(13) con (char)10 con (char)13... Pero no lo consigo. ¿Alguien sabe algo al respecto?
Title: Re: Lectura de cadenas formateadas
Post by: DCelso on July 20, 2009, 07:50:12 PM
por lo que sé, creo que no se puede, write está preparado para escribir a partir de la coordenada que le digas. tendrás que hacer un for para recorrer las líneas a mostrar avanzando y de 20 en 20 o similar dependiendo del tamaño del tipo de letra.
Si solo es para depurar, creo que say sí que interpreta los salto de línea.
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on July 20, 2009, 08:16:32 PM
No, es para mostrar texto en un cuadro, cuando se trata de algo demasiado largo mi idea era poner esos "hipotéticos saltos de línea"...

Será cuestión de usar las funciones de troceo de cadenas, vaya chasco :-\

Al menos haré un módulo que se encargue de comerse el marrón para la próxima vez... Porque siempre hay una próxima vez ;D
Title: Re: Lectura de cadenas formateadas
Post by: darío on July 20, 2009, 09:15:22 PM
Yo tengo un código que hice para Fenix que servía para mostrar texto por pantalla. Era altamente configurable, permitía por ejemplo mostrar un gráfico de fondo distinto en función del número de líneas, definir el máximo número de líneas, escribir a modo "máquina de escribir", hacer efectos de entrada del cuadro y otras muchas cosas.

Lo estoy adaptando a Bennu (ya lo he compilado, pero voy a separar ejemplo de rutina para que se use como include), ahora en un ratito lo subo. Creo que te podrá servir para lo que pretendes.

En una hora más o menos lo subo (tengo que hacer unas cosas antes).

Un saludo,
Darío
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on July 20, 2009, 10:06:49 PM
Joder, estaría de lujo, ¿También permitía saltar de línea si el texto era demasiado largo?

Lo espero ansioso. A ver si es sencillito de verdad, que he intentado usar varias veces código de terceros pero casi siempre se me calienta la cabeza y según lo que sea me lo codeo yo desde 0...

Si lo veo útil y lo termino incluyendo en mi aplicación te doy un karmazo :o
Title: Re: Lectura de cadenas formateadas
Post by: darío on July 20, 2009, 10:55:39 PM
Hola, perdona, al final he tenido que corregir alguna cosilla que otra más para que funcionase...

Lo del salto de línea, sí, lo hace automáticamente.

Es bastante configurable, lo que hace también que sea documentable perder un poco de tiempo leyendo la documentación. Lo hice hace bastante tiempo así que hay algunas cosas que a día de hoy las hubiera hecho de otra manera. También es posible que exista algún fallo.

La documentación está en el archivo WDB.h, pero el archivo que puedes compilar y ejecutar para probar es el ejemplo.prg.

Puesto que creo que tu no quieres escribir a modo "máquina de escribir", deberás ajustar los parámetros de velocidad (ya verás lo que digo cuando leas la documentación) a 0. De este modo no habrá espera (el texto se muestra inmediatamente).

Si tienes cualquier duda no dudes en preguntar.

Un saludo,
Darío
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on July 21, 2009, 11:49:24 AM
Dario, me ha funcionado, pero como estoy en Linux he tenido que pasar a minúsculas algún nombre de archivo. Te dejo aquí el link con exactamente lo mismo que me has pasado tú pero el archivo .fnt y el archivo .map pasado a minúsculas, junto con un .sh para autocompilar y ejecutar en Linux:

DESCARGAR: http://www.mediafire.com/?rxydgmqjmtr (http://www.mediafire.com/?rxydgmqjmtr)

Karma up!!!

Una consulta, tu paquete interpreta  sólamente desde fichero, ¿Verdad? Es que en mi caso no me sirve, ya que lo que yo quiero que escriba es una cadena con algunos argumentos utilizando el operador '+':

"El puntero en la direccion: " + list_head + " almacena el valor: " + (*list_head).dato + " y su siguiente dato se encuentra en la direccion: " + (*list_head).next

Quizá el ejemplo parece excesivo... Pero la cuestión, quiero que sea capaz de escribir ese tipo de "cadenas con atributos" formateadas de la misma forma que hace tu programa.

Voy a revisar tu código a ver si puedo meterle alguna cosa para hacerlo funcionar...

Gracias!!!

EDIT: CONSEGUIDO!!! He cogido la cadena esa con todos sus atributos, la he metido con fputs en un fichero, se la he pasado a tu WD y sale perfectamente formateada. Incluso los valores de puntero que son números muy largos saltan de línea correctamente, estoy excitado :o

Voy a meter tu WD como modulo de mi juego y le asociaré un pequeño módulo encargado de pasar a fichero la cadena para casos en los que quieres mostrar una cadena en lugar de un fichero. Grande, muy grande sí señor, saldrás en los créditos ;D
Title: Re: Lectura de cadenas formateadas
Post by: darío on July 21, 2009, 05:53:12 PM
Hola, me alegro de que te pueda servir :). Lo que dices de los nombres de archivos, es algo que antes no tenía en cuenta (ahora sí suelo tenerlo), pero gracias en cualquier caso por el apunte y las correcciones.

No es necesario cargar el texto del archivo. Simplemente sustituye:

wd_load_text("./texto.txt",1, &wd.rTexto);

por:

wd.rTexto = "Este es mi texto. &Y esto está en otra línea";

y prueba...

Si no lo has hecho, recomiendo encarecidamente que te leas la documentación incluida en el archivo WDB.h. Está casi todo explicado y verás cosas que se pueden configurar que no se usan en el ejemplo. También sería interesante que leyeses un apartado que pone "Limitaciones" para que evites situaciones extrañas.

Un saludo,
Darío
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on July 21, 2009, 06:36:28 PM
Aahhh, me había leído el uso de los campos de esa estructura pero no había caído en que ahí se guardaba la cadena...

Ya lo tengo solventado, pero lo tendré en cuenta para la próxima vez.

He tenido que modificar un poco las cosas ya que para la aplicación que estoy haciendo quería que esos muestreos de texto sean "bloqueantes", así que he cambiado PROCESS por FUNCTION y he tenido que prescindir de efectos que congelaban/descongelaban al "padre" del proceso.

En cualquier caso, lo he mirado bastante a fondo y lo veo muy muy bien, sólo he echado en falta un detalle sencillísimo: Uno de los campos indica el graph a usar, ¿No convendría tener también un file por si hay varios FPG cargados como era mi caso?

Es algo que también he solucionado por mi cuenta, pero es por darte ideas, por si algún día te pones a hacer nueva versión o lo que sea :P

Thanks again!
Title: Re: Lectura de cadenas formateadas
Post by: darío on July 21, 2009, 10:05:36 PM
Lo de los Process por functions... bueno, cuando hice esto ni siquiera existían los function en Fenix creo jeje.

Lo del file, la verdad es que sí hubiese sido buena idea ponerlo (no se me ocurrió) así que bueno, si algún día me pongo a retocar esto lo tendré en cuenta :).

Ah y gracias por el karma.

Darío
Title: Re: Lectura de cadenas formateadas
Post by: splinter_work on July 22, 2009, 02:24:45 PM
yo uso textos como procesos en el instalador bennu.

write_in_map
map_put
Title: Re: Lectura de cadenas formateadas
Post by: Windgate on July 22, 2009, 06:55:49 PM
Todavía no he usado la escritura de textos como procesos, aunque las flechas del radar de mi Sardines serían una buena opción donde probarlos... Por ejemplo para indicar el nombre del "enemigo" al que están señalando.

Ahora me preocupaba la escritura de una única cadena de texto que pueda aparecer en varias líneas si no cabe dentro de su cuadro de texto, por el momento está resuelto, menos mal...

En cuanto me ponga a probar la escritura de textos como procesos si tengo alguna duda te pregunto Splinter :D