CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Nov 2018 17:57

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 26 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: 07 Jul 2010 10:54 
Desconectado
Aventurero
Aventurero

Registrado: 14 Jun 2010 11:49
Mensajes: 4
Buenas de nuevo,

Tengo un problemilla para comparar dos cadenas. He seguido los que se comenta en este post y en principio funciona perfectamente en el caso que se contempla ahí. El problema lo tengo cuando quiero comparar una cadena que introduzco desde teclado con otra que está predefinida en el programa.

Os pongo el código:

Código:
Constant MAX_LONG_WORD 8;

array palabra1 -> MAX_LONG_WORD;

[palabra pal x;
    do{
        print "Introduce palabra (máximo ", MAX_LONG_WORD, " bits): ";
        KeyboardPrimitive(buffer,parse);
    }until (buffer-->0~=0 && buffer -->0<=MAX_LONG_WORD);
   
    for (x=0:x<=(buffer-->0)-1:x++)
        palabra1->x = buffer->(x+4);
   
    confirmar_palabra(pal);
];

[confirmar_palabra pal x;
    for (x=0:x<=MAX_LONG_WORD-1:x++){
        if (palabra1->x ~= pal->x){
            print "Las palabras no coinciden^";
            rfalse;
        }
    }
    "^Las palabras coinciden.^";
];


La llamada al procedimiento "palabra" la hago introduciéndole la palabra que quiero comprobar con la entrada de teclado (ej. palabra("10010110");). El caso es que si escribo por pantalla con un print la palabra que he puesto en la llamada al procedimiento me pone una cosa distinta, en este caso me escribe "111155".

Por el contrario, con KeyboardPrimitive introduzco la misma palabra de 8 bits "10010110" y luego imprimo "palabra1" que es donde se supone que se guarda lo que introduzco por teclado, me imprime "128377". Por supuesto son diferentes y nunca me dice que las palabras coinciden. Supongo que es por un uso incorrecto de la función KeyboardPrimitive, pero mirando la documentación en inglés de aquí no consigo sacar nada en claro sobre cómo modificar mi programa.

No sé si me he explicado bien, pero agradezco cualquier sugerencia.

Gracias a todos :wink:


Arriba
 Perfil  
 
NotaPublicado: 07 Jul 2010 20:20 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Probablemente no pueda ayudarte mucho, pero sí ayudaré a otros a asistirte haciendo que respondas lo siguiente:
Por este código parece una aventura en I6. Dinos si es INFSP o InformATE. Si es este último, te aconsejaría mirar, aunque nunca se llegó a terminar, el manual en español DocumentATE, ya que InformATE es una librería Inform muy modificada y por ende muchas de las cosas que se dicen en el Designers manual en inglés no son válidas; este problema de invalidez, al parecer, no ocurre con INFSP debido a que éste es un módulo de idioma que corre sobre la librería estándar y son pocas las rutinas que hackea para soportar aspectos muy exclusivos del español como verbos irregulares.

¡Saludos!


Arriba
 Perfil  
 
NotaPublicado: 07 Jul 2010 22:00 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 726
Hola. Hace un par de meses estuve jugueteando un poco por encima con este tipo de cosas. Parte del código que manejé era un copy-paste de otras páginas (http://www.firthworks.com/roger/informfaq/tt.html#11) y mucho de lo demás un juego ensayo-error hasta conseguir que funcionara, por lo que no aprendí gran cosa (y no te voy a poder explicar gran cosa tampoco), pero el siguiente código funciona:

Código:
!!------------------------------------------------------------------------------
!! Lee una cadena de caracteres de teclado. Los caracteres son colocados en un
!! array 'buffer' cuya primera palabra contiene el número de caracteres que han
!! sido tecleados, y sus siguientes bytes contienen esos caracteres.
!! @param: El array sobre el que se va a escribir la entrada.
!! @param: El número máximo de caracteres que se van a leer (entero)
!! @return: El número de caracteres tecleados.
!!
#Ifdef    TARGET_ZCODE;
[ KeyLine buf max;
   buf->0 = max;
   buf->1 = 0;
   read buf 0;
   buf->0 = 0;
   !! Recorta el array
   TrimString(buf);
   return buf-->0;
];
#Ifnot;   !TARGET_GLULX
[ KeyLine buf max;
   glk($00D0, gg_mainwin, buf+WORDSIZE, max, 0); ! request_line_event
   while (true) {
      glk($00C0, gg_event); ! select
      if (gg_event-->0 == 3 && gg_event-->1 == gg_mainwin) break;
   }
   buf-->0 = gg_event-->2;
   !! Recorta el array
   TrimString(buf);
   !! Lo pasa a minúsculas
   LowerCaseString(buf);
   !! Lo retorna
   return buf-->0;
];
#Endif;   !TARGET_


!!------------------------------------------------------------------------------
!! Imprime por pantalla un array de caracteres dado
!! @param: El array a imprimir en pantalla
!!
[ PrintString buf
   i;
   for (i=0 : i<buf-->0 : i++) print (char) buf->(i+WORDSIZE);
];


!!------------------------------------------------------------------------------
!! Elimina todos los espacios en blanco (caracter ' ') del final de un array
!! @param: El array sobre el que se realizará el recorte
!!
[ TrimString buf;
   while ( buf->(WORDSIZE+(buf-->0)-1) == ' ' ) buf-->0 = buf-->0 - 1;
];


!!------------------------------------------------------------------------------
!! Transforma todos los caracteres de un array dado a minúsculas
!! @param: El array sobre el que se realizan las modificaciones
!!
[ LowerCaseString buf
   i c;
   for ( i=0 : i<buf-->0 : i++) {
      c = buf->(i+WORDSIZE);
      buf->(i+WORDSIZE) = LowerCase(c);
   }
];


!!------------------------------------------------------------------------------
!! Capitaliza la primera letra de cada palabra del array. Idóneo si el array
!! almacena el nombre de una persona (Paul O'Brian, Jean-Paul Sartre,...) o de
!! una localidad (Weston-Super-Mare, Los Angeles,...)
!! @param: El array sobre el que se realizará la capitalización
!!
[ CapitaliseString buf
   i c flg;
   for (i=0,flg=true : i<buf-->0 : i++) {
      c = buf->(i+WORDSIZE);
      if (c >= 'a' && c <= 'z') {
         if (flg) buf->(i+WORDSIZE) = UpperCase(c);
         flg = false;
      }
      else
         flg = true;
   }
];


!!------------------------------------------------------------------------------
!! Comprueba si dos arrays de caracteres dados son iguales
!! @param: El primer array de caracteres que comparar
!! @param: El segundo array de caracteres que comparar
!!
[ CompareStrings bufA bufB
   i;
   if (bufA-->0 ~= bufB-->0) rfalse;
   for (i=0 : i<bufA-->0 : i++)
      if (Lowercase(bufA->(i+WORDSIZE)) ~= LowerCase(bufB->(i+WORDSIZE)))
      return false;
   return true;
];


Para pedir el input del jugador/usuario:
Código:
Constant playerName_SIZE 30;
Array   playerName   buffer playerName_SIZE;

print "Input:^";
until ( KeyLine(playerName, playerName_SIZE) );


Usé esto para hacer un juego de rimas. Se pasaban los primeros versos al jugador y se evaluaba su entrada de texto para ver si rima correctamente. Si quieres todo el código fuente para ojearlo y la versión compilada del minijuego no tienes más que darme una dirección de correo electrónico y te lo mando.

En cualquier caso, creo que algún gurú de inform como son Jarel o Eliuk Blau por ejemplo te puedan resultar de más ayuda.

Un saludo!


Arriba
 Perfil  
 
NotaPublicado: 07 Jul 2010 22:23 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
CSO escribió:
Código:
Constant MAX_LONG_WORD 8;

array palabra1 -> MAX_LONG_WORD;

[palabra pal x;
    do{
        print "Introduce palabra (máximo ", MAX_LONG_WORD, " bits): ";
        KeyboardPrimitive(buffer,parse);
    }until (buffer-->0~=0 && buffer -->0<=MAX_LONG_WORD);
   
    for (x=0:x<=(buffer-->0)-1:x++)
        palabra1->x = buffer->(x+4);
   
    confirmar_palabra(pal);
];

[confirmar_palabra pal x;
    for (x=0:x<=MAX_LONG_WORD-1:x++){
        if (palabra1->x ~= pal->x){
            print "Las palabras no coinciden^";
            rfalse;
        }
    }
    "^Las palabras coinciden.^";
];


En Inform las cadenas de texto son codificadas como algo llamado "packed strings". Cadenas empaquetadas. Es una forma de "comprimir y codificar" una cadena de texto para que ocupe menos memoria y para evitar de una manera básica que pueda ser leída a traves de un editor hexadecimal.

KeyboardPrimitive() pide un array, un buffer exactamente, en el que meter lo que escribas en el teclado. Este array NO ES una cadena empaquetada. No puedes llegar e imprimirla. Sino que tienes que imprimir cada uno de los caracteres según el subindice del array mediante la sintaxis "print (char)". El (char) es muy importante. Porque en inform todas las variables no son más que referencias. Así que debes "castear/interpretar" sus valores antes de ocuparlos. Solo los números no son referencias. El resto de variables son todas por referencia.

Otra cosa: si estás tratando de imprimir un array, como lo dije anteriormente, no puedes llegar e imprimirlo, debes recorrer e imprimir cada uno de sus caracteres con (char). Si quieres comparar un array con una cadena del tipo "hola" [cadena empaquetada], debes primero desempaquetarla. Hay una función incorporada para eso, pero de momento no la recuerdo. Una vez desempaquetada (la mete en otro array libre que tengas por ahí), ya puedes comparar los dos arrays indice por indice.

Lamento no poder ayudar más, de momento, porque el tema de las cadenas no es uno que ocupe frecuentemente así que hay cosas que se me han olvidado. Voy a ver si me hago un tiempecito y repaso esto para darte alguna solución. :D

Saludos!

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Última edición por Eliuk Blau el 08 Jul 2010 20:41, editado 1 vez en total

Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2010 09:27 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Y luego, para liar la cosa están las palabras de diccionario.

Zak escribió un documento explicando los arrays y sus diferencias con los tipos de cadenas, en especial el punto 4:

http://www.caad.es/informate/docs/tablas.zip


Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2010 11:42 
Desconectado
Aventurero
Aventurero

Registrado: 14 Jun 2010 11:49
Mensajes: 4
Fernando Gregoire escribió:
Probablemente no pueda ayudarte mucho, pero sí ayudaré a otros a asistirte haciendo que respondas lo siguiente:
Por este código parece una aventura en I6. Dinos si es INFSP o InformATE. Si es este último, te aconsejaría mirar, aunque nunca se llegó a terminar, el manual en español DocumentATE, ya que InformATE es una librería Inform muy modificada y por ende muchas de las cosas que se dicen en el Designers manual en inglés no son válidas; este problema de invalidez, al parecer, no ocurre con INFSP debido a que éste es un módulo de idioma que corre sobre la librería estándar y son pocas las rutinas que hackea para soportar aspectos muy exclusivos del español como verbos irregulares.

¡Saludos!


Entiendo. Yo uso InformATE y estoy siguiendo todo lo que veo en DocumentATE, pero esto que necesito hacer no viene mucho por ahí.

Gracias a todos por las respuestas :)


Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2010 20:46 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
CSO escribió:
Entiendo. Yo uso InformATE y estoy siguiendo todo lo que veo en DocumentATE, pero esto que necesito hacer no viene mucho por ahí.

Gracias a todos por las respuestas :)


Es parte de las falta de documentación técnica de la que yo hablaba en el hilo sobre InformATE! vs INFSP6. Esa falta de documentación técnica impide el avance. Porque el DocumenATE! te enseña los entresijos de la InformATE!, pero no te enseña a deselvolverte con el lenguaje... y eso es un HORRENDO error.

Al primer momento que intentas hacer algo "especial", te das cuenta que prácticamente no sabes nada de como lograrlo en el lenguaje Inform.

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 08 Jul 2010 21:28 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Eliuk Blau escribió:
CSO escribió:
Entiendo. Yo uso InformATE y estoy siguiendo todo lo que veo en DocumentATE, pero esto que necesito hacer no viene mucho por ahí.

Gracias a todos por las respuestas :)


Es parte de las falta de documentación técnica de la que yo hablaba en el hilo sobre InformATE! vs INFSP6. Esa falta de documentación técnica impide el avance. Porque el DocumenATE! te enseña los entresijos de la InformATE!, pero no te enseña a deselvolverte con el lenguaje... y eso es un HORRENDO error.

Al primer momento que intentas hacer algo "especial", te das cuenta que prácticamente no sabes nada de como lograrlo en el lenguaje Inform.

¿Pero esas cosas especiales fueron modificadas en InformATE de tal forma que no sirva lo explicado en el Designers Manual? Si no es así, ¿Es posible usar cosas externas a Inform como Axelcodes?

¡Saludos!


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2010 01:04 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Fernando Gregoire escribió:
¿Pero esas cosas especiales fueron modificadas en InformATE de tal forma que no sirva lo explicado en el Designers Manual? Si no es así, ¿Es posible usar cosas externas a Inform como Axelcodes?

¡Saludos!


Yo diría que el 50% de lo explicado en el Designer's Manual no sirve para InformATE!

Y sí, los opcodes de aceleración son parte de la Glk, no de Inform. Así que son idependientes del lenguaje.

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2010 06:09 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Eliuk Blau escribió:
Yo diría que el 50% de lo explicado en el Designer's Manual no sirve para InformATE!

Y sí, los opcodes de aceleración son parte de la Glk, no de Inform. Así que son idependientes del lenguaje.

La verdad es que estoy pensando a pensar en el gran error que dices en la documentación de InformATE y es algo preocupante; ¿Cuánto es que falta por terminar? ¿Qué posibilidad habría de terminarlo?; A pesar de no contar con la misma facilidad que si estuviese en DocumentATE, ¿Pueden otros documentos como el inventario informal de modificaciones de InformATE sobre el core de Inform de Sarganar y otros sobre InformATE enseñar cosas del lenguaje InformATE no comentadas en DocumentATE? Si esto no es posible, ¿Pueden deducirse líneas de código mirando los archivos .H de la librería si uno más o menos sabe? Este punto creo que si es posible podría ayudar puesto que la forma de las librerías debe tener cierto común con lo explicado en el Designers Manual sobre el lenguaje Inform y, siendo así, uno debería estudiar eso y a pesar de las diferencias comprendería InformATE.

¡Saludos!


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2010 08:35 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Sep 2004 12:53
Mensajes: 1142
Eliuk Blau escribió:
Yo diría que el 50% de lo explicado en el Designer's Manual no sirve para InformATE!


Yo diría que exageras bastante :)

Fernando, ten en cuenta que el uso que hace Eliuk de Inform es intensivo y a bastante bajo nivel (es decir, metiéndose bastante en las tripas), por lo que seguro que la documentación de InformATE se le queda corta. Pero en general lo que hay sirve perfectamente para un diseñador de aventuras a nivel medio. Prueba de ello es la cantidad de aventuras que se han publicado y de cuantos autores distintos.

Por otro lado para una persona que empieza yo recomiendo mucho más el Inform Beginner's Guide (todavía me duele que Emily no nos dejara traducirlo) que el Designer's Manual.

_________________
- Lenko -


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2010 10:52 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4628
Lenko escribió:
Por otro lado para una persona que empieza yo recomiendo mucho más el Inform Beginner's Guide (todavía me duele que Emily no nos dejara traducirlo) que el Designer's Manual.


Hmmm.. ¿hubo una negación expresa o algo?

Lo digo porque aquí:

http://www.inform-fiction.org/manual/download_ibg.html

hay una versión traducida al italiano.

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2010 11:50 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 09 Sep 2004 12:53
Mensajes: 1142
Sí, hubo negación expresa precisamente a causa de la versión en italiano, ya que ella decía que no se había continuado y los cambios realizados en el IBG no estaban actualizados.

Yo le respondí con una obviedad: para alguien que no sepa inglés es mucho más interesante tener una guía desactualizada que no tener nada. Pero no hubo forma, se cerró en banda con el tema.

Así que ya lo de cambiar la sintaxis de la guía por la de InformATE (en aquella época no teníamos InfSP) ni se me ocurrió plantearlo.

Me pareció una actitud egoísta por su parte (un ataque de autoritis) y una pequeña decepción con el personaje, la verdad.

_________________
- Lenko -


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2010 21:22 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 24 Ago 2007 00:41
Mensajes: 2023
Ubicación: Chile
Lenko escribió:
Yo diría que exageras bastante :) Fernando, ten en cuenta que el uso que hace Eliuk de Inform es intensivo y a bastante bajo nivel (es decir, metiéndose bastante en las tripas), por lo que seguro que la documentación de InformATE se le queda corta.


Sí, es la desviación profesional. xD En todo caso, insistiría en el porcentaje. La mitad del DM es sobre el lenguaje, y la otra mitad sobre la librería. La mitad sobre el lenguaje es altamente util, porque el DocumentATE! no comprende tal información. La mitad sobre la librería se queda coja, porque InforATE! no usa la misma sintaxis y hay que entrar a "recodificar", cosa sumamente molesta... además que existen pequeñas variaciones en el uso de ciertos elementos. Joder, no me pidan nombrarlos, porque no me los recuerdo al dedillo, pero me los he ido topando a lo largo del tiempo. :wink:

Lenko escribió:
Por otro lado para una persona que empieza yo recomiendo mucho más el Inform Beginner's Guide (todavía me duele que Emily no nos dejara traducirlo) que el Designer's Manual.


Totalmente de acuerdo. El Beginner's Guide es sin duda la mejor elección para aprender Inform6 + Lib. Inform. También existe otro buen documento de FAQ del OnyxRing. Esos chicos eran brillantes y tenían respuestas casi para todo. Todos estos documentos vienen incluidos en el prox. Kit del Programador de INFS6, por cierto. :mrgreen:

Saludos! :D

_________________
Eliuk Blau
eliukblau (AT) gmail.com
http://www.caad.es/eliukblau/


Arriba
 Perfil  
 
NotaPublicado: 09 Jul 2010 21:25 
Desconectado
Implementador
Implementador

Registrado: 09 Jun 2010 14:50
Mensajes: 1655
Ubicación: Argentina
Lenko escribió:
Sí, hubo negación expresa precisamente a causa de la versión en italiano, ya que ella decía que no se había continuado y los cambios realizados en el IBG no estaban actualizados.

Yo le respondí con una obviedad: para alguien que no sepa inglés es mucho más interesante tener una guía desactualizada que no tener nada. Pero no hubo forma, se cerró en banda con el tema.

Así que ya lo de cambiar la sintaxis de la guía por la de InformATE (en aquella época no teníamos InfSP) ni se me ocurrió plantearlo.

Me pareció una actitud egoísta por su parte (un ataque de autoritis) y una pequeña decepción con el personaje, la verdad.

¡Qué mal! ¿Lo permitirá ahora que existe INFSP?
Y en cuanto a que antiguamente no existía INFSP, tengo entendido que sí existían módulos independientes en español para el Inform 6 viejo, antes del actual InformATE.
Y en cuanto a que la documentación es suficiente para la mayoría de autores seguro que es así, pero el bajonivel también es parte del lenguaje y debería de estar documentado.

¡Saludos!


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 26 mensajes ]  Ir a página 1, 2  Siguiente

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM