Diciembre 02, 2015, 04:06:38 AM Ultima modificación: Diciembre 02, 2015, 02:14:44 PM por millansoft
Hola,

Se me dio una situacion en la cual podria ahorrar cientos de lineas de codigo por lo que veo, o eso creo.

Tengo una serie de variables por ejemplo asi:

rival0 = 80;
rival1 = 34;

Y trate de hacer algo asi:

for (i = 0; i < 78; i++)
    {rival = "rival" + string(i);
    script_execute(rivales);}


O sea que el valor de la variable rival termine siendo el valor de la variable rival00, pero me aparece un error de ejecucion y estoy casi seguro es que porque en lugar de aplicarle el valor de rival0, le deja el string "rival0" a la variable rival.

Hay forma de que le deje el valor y no el string?

Gracias!

#1 Diciembre 02, 2015, 04:15:08 AM Ultima modificación: Diciembre 02, 2015, 04:17:22 AM por NiuWeb
No entiendo del todo que es lo que pretendes hacer. Tu código va a reemplazar los valores en la misma variable, y al final del ciclo tendrás una sola variable así:
[gml]
rival = "rival77";
[/gml]

Si lo que quieres es que guarde muchas variables, por ejemplo, así:
[gml]
rival1 = 0;
rival2 = 1;
...
[/gml]
Usa los arrays. Sólo debes hacer esto:
[gml]
for(i=0;i<78;i++)
{
   rival = i;
}
[/gml]
Eso va a crear una serie de 78 arrays que se pueden ver algo así:
[gml]
rival[0] = 0;
rival[1] = 1;
rival[2] = 2;
......
[/gml]

Y estos arrays se pueden usar igual que una variable, por ejemplo, puedes hacer:
[gml]
draw_text(32,32,string(rival[10]));
[/gml]

Sin problema alguno :D
Espero te ayude
alaberga regué el café.

BA:STFW&RTFM

Hola,

Gracias por responder pero no es eso, necesito que la variable rival tenga el valor de la variable rival0, ejecutar un script con ese valor en rival, luego rival el valor de la variable rival1, ejecutar de nuevo el script y asi 78 veces. Pero me queda el string "rival0" y no el valor de rival0 que es lo que busco, se podra hacer eso?

Saludos

Entonces es lo mismo, ya que no puedes crear una variable como string. Más detalladamente, no puedes hacer esto:
[gml]
"rival1" = 3;
[/gml]
Con eso es decir mucho :D
Lo puedes hacer como te digo, usando arrays. Por ejemplo, al inicio, en vez de poner rival1, rival2, rival3; pon rival[1],rival[2],rival[3]...Te explico:
[gml]
rival[1] = 32;
rival[2] = 66;
rival[3] = 70;
//......

for(i=1;i<=78;i++) //Procura comenzar el ciclo en uno y que sea menor que 79, o menor e igual a 78.
{
  rivall = rival; //Recuerda que el array y la variable normal deben ser diferentes para evitar problemas :D
  rivales(); //Ejecutas tu script
}
[/gml]
alaberga regué el café.

BA:STFW&RTFM

#4 Diciembre 02, 2015, 07:37:17 AM Ultima modificación: Diciembre 02, 2015, 08:04:08 AM por penumbra
Cita de: millansoft en Diciembre 02, 2015, 04:06:38 AM
Hay forma de que le deje el valor y no el string?
Como lo pretendes realizar, no. Analizando tu código:
[gml]rival = "rival" + string(i);[/gml]
Lo que hace es que la cadena "rival" se concatena con la cadena string(i). Por ejemplo, en la primera iteración del ciclo, del lado derecho de la igualdad se tiene "rival0".

La cadena "rival0" es precisamente, una cadena, no una variable. No hay relación (para GM) entre "rival0" y la variable rival0. Es cierto que lucen similares, ambas aparentemente están compuestas por los mismos caracteres, pero para GM son cosas distintas. Para GM, "rival0" es una serie de caracteres ascii (o utf-8), mientras que rival0 es un identificador que apunta a una dirección de memoria.

Fíjate que incluso en el editor de GM, el color de una cadena "valor0" es distinto al color de una variable valor0, para ayudar a diferenciar su "naturaleza".

Lo más sencillo es que uses arreglos, como te sugirió NiuWeb. Si eres de los que no se conforman con el método más sencillo, entonces, sí hay una manera para que, variando el sufijo numérico de una cadena puedas acceder a un valor guardado: Mapas.

Los mapas almacenan información basándose en un esquema clave-valor. Las claves en un mapa pueden ser cadenas, por lo que un mapa puede tener una estructura
"rival0": 84
"rival1": 34
"rival2": 50

Entonces, aquí sí que es posible usar el truco
[gml]"rival" + string(i)[/gml]
para recorrer el mapa, modificando el valor de i. Las claves de los mapas también pueden ser números, y como en GMS ahora hay "accessors", casi no hay diferencia entre manejar mapas y manejar arreglos (desde el punto de vista de facilidad de uso, no digo que sean la misma cosa)

Hola,

Gracias por la ayuda, ya lo resolvi con un array, pero igual me habia quedado la duda de si se podia hacer lo que les preguntaba, porque recordaba haber leido un libro de C++ y en una situacion similar habia una forma no muy complicada de hacerlo recuerdo, pero como lo lei hace años y el C++ nunca lo termine usando en nada, ya no recuerdo bien.

Saludos!

       Saludos Makeros:

Makero millansoft y makero penumbra, en realidad sí hay una forma de llamar a una variable de manera dinámica.   :-[

En estos momentos no tengo GM aquí en el trabajo, pero existen unas funciones con las cuales se pueden generar variables, "cuasi", en tiempo real. Dichas funciones no solo crean variables sino que las abren para su lectura y escritura.    :-[

Recuerdo que para un proyecto, utilizando GM, las empleé mucho. Mañana, en cuanto lea el manual otra, colocaré sus nombre y algún ejemplo de uso...   :-[

Aun así, la forma que el makero millansoft quiere realizar llamados a dichas variables puede realizarse de otra manera y ahorrar líneas código, que era su intención inicial, creo.   ???

Espero haber servido de algo...   ;D


Tengo entendigo que en GM8 existen dichas funciones, pero ¿En GMS también? Lo último que recuerdo haber leído, no sé en donde, que en GMS se habían eliminado estas funciones. Y por el ícono del tema podemos inferir que el problema es en GMS ¿no?
alaberga regué el café.

BA:STFW&RTFM