CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Ago 2017 12:45

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 5 mensajes ] 
Autor Mensaje
NotaPublicado: 19 Nov 2014 14:03 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1842
Hola gente, ¿cuánto tiempo verdad?

Bueno dejo los saludos para otra ocasión y me centro en el problema que tengo entre manos.

De unos años acá he visto que El extraño caso de Randolph Dwight ha envejecido muy mal, concretamente es muy molesto jugar debido a este mensaje de error:

Glulxe warning: Memory access was much too long -- perhaps a print_to_array call with only one argument.

Total, que al fin me he dedicido a darle una vuelta a mis antiguos juegos (10 años ya, puf) y sacar una revisión actualizada.

Al principio creía que era un problema de un filtro que implementó Zak en este juego para meter un sistema algo sofisticado de concatenación de frases, pero cuando he quitado todo el código pertinente (un acierto, gracias a eso tengo Dwight compilando para máquina Z, algo que antes era imposible), me he dado cuenta de que el error persiste.

Lo que está fallando es la librería Capitular.h de JSJ, que como nadie jamás más que yo la ha usado, pues el error había pasado inadvertido. Con el tiempo todos los intérpretes Glulx han actualizado de alguna manera que me meten ese molesto error.

El código de capitula.h que me ofende es este:


! imprimimos un texto usando letra capitular
[ ImpCapitular txt
i c res;
txt.print_to_array(StringAux);
! primer carácter del texto
c=StringAux->WORDSIZE;

#ifdef TARGET_ZCODE;
! bajo máquina-Z imprimimos el carácter en negrita
res=0; ! para evitar 'warning'
style bold;
print (char)c;
style roman;
#ifnot;
! bajo Glulx imprimimos letra capitular
i=CodLetraCapitular(c);
res=LetraCapitular(i);
! si no pudimos...
if(res==0) print (char)c;
#endif;

! imprimimos el resto de la cadena
for(i=WORDSIZE+1: i<=StringAux-->0+WORDSIZE-1: i++) print (char)StringAux->i;
];

Y la linea en concreto esta:

txt.print_to_array(StringAux);

Que sinceramente no se que demonios hacer con ella para repararlo. He probado a rastrear el PrintAnyToArray, pero no tengo ni idea de cómo manejarlo.

En máquina Z sigue funcionando bien, así que si me dais una solución para Glulx puede meter una directiva de compilador para que la solución sólo afecte a Glulx.

¿Alguna idea?

Gracias!!!

_________________
Ruber "Urbatain" Eaglenest.
------------------------
http://www.indieorama.com/author/rubereaglenest/


Arriba
 Perfil  
 
NotaPublicado: 19 Nov 2014 14:51 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1854
Hola Urbatain, qué bueno que estés revisando tus obras.

Una respuesta rápida, a ver si te encamina lo suficiente. Si te hace falta más detalle vas diciendo.

Urbatain escribió:
Glulxe warning: Memory access was much too long -- perhaps a print_to_array call with only one argument.

Creo entender que el mensaje da la pista adecuada.

A la función a print_to_array hay que pasarle el segundo argumento, que indica la longitud máxima a copiar (generalmente, el tamaño del buffer... teniendo en cuenta los cuatro bytes iniciales y tal).

Busca "Limited Length print_to_array" en http://www.eblong.com/zarf/glulx/inform-guide.txt

También es relevante...
Citar:
arraylimittest.inf (arraylimittest.ulx): a game which calls print_to_array(buf) with no second argument. (This demonstrates the ability of the interpreter to catch this mistake and display a warning or error.)

http://www.eblong.com/zarf/glulx/arraylimittest.inf en http://www.eblong.com/zarf/glulx/

Suerte (y gracias por tus artículos sobre IF).


Arriba
 Perfil  
 
NotaPublicado: 20 Nov 2014 10:52 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1842
Genial, lo he arreglado. Ha sido fácil con tus indicaciones. ¡Gracias!

He hecho los siguientes cambios:

#ifdef TARGET_GLULX;
txt.print_to_array(StringAux, 1000);
#ifnot;
txt.print_to_array(StringAux);
#endif;

Teniendo en cuenta que StringAux está definido así:

Array StringAux->1000;

Por tanto tengo una versión de Capitular.h arreglada y lista para funcionar en el siglo XXI. ¿Como debemos proceder para actualizar la versión añeja? ¿Se lo paso a Sarganar?

Bueno, sigue dando un warning al compilar, pero luego funciona perfectamente:

capitular.h(169): Warning: Using '-->' to access a -> or string array
> for(i=WORDSIZE+1: i<=StringAux-->0+WORDSIZE-1: i++)

Pero si cambio -->por -> se rompe por completo y con ese warning el juego funciona correctamente.

_________________
Ruber "Urbatain" Eaglenest.
------------------------
http://www.indieorama.com/author/rubereaglenest/


Arriba
 Perfil  
 
NotaPublicado: 20 Nov 2014 14:01 
Desconectado
Implementador
Implementador

Registrado: 13 Feb 2005 18:57
Mensajes: 1854
El tema de los arrays de Inform... creo que nunca lo acabaré de entender del todo, pero puedes intentar declarar el buffer utilizando la nueva directiva buffer introducida en Inform 6.3, que parece adecuada en este caso (aunque no sé si romperá otros usos de StringAux, será cuestión de probar).
(Parte de la explicación sobre la nueva directiva en el) WHATSNEW escribió:
This creates a hybrid array of the form used by string.print_to_array and the new library routine PrintToBuffer( ), in which the first word array-->0 contains N and the following N bytes contain the specified expression values or string characters.


O sea...
Código:
Array StringAux buffer 1000;

(Visto en RAIF, en el hilo de marzo de 2008 "I6 - Problem with arrays moving to 6.31 and 6/11?" [*]. Aunque el caso no es exactamente el mismo, el mensaje de error y el hecho de que esté en juego, según entiendo, una función que maneja un hybrid array parece relevante.)

Pero no me hagas mucho caso. Corregidme los expertos si ando desencaminado.

[*] No tengo a mano un enlace directo, lo siento. Lo he visto en el fichero de backup de RAIF llamado r.a.i-f-1996-2012.mbox.bz2 en ifarchive.


Arriba
 Perfil  
 
NotaPublicado: 21 Nov 2014 14:10 
Desconectado
Archivero
Archivero

Registrado: 19 Nov 2008 12:32
Mensajes: 268
Urbatain escribió:
¿Como debemos proceder para actualizar la versión añeja? ¿Se lo paso a Sarganar?



Sip. Enviadmelo, por favor, a mi gmail.

Chas gracias.

_________________
I7 Spanish / Notas de desarrollo


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 5 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM