Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: bygdle en Febrero 29, 2016, 12:28:30 AM

Título: División de cadenas por un separador (Explode)
Publicado por: bygdle en Febrero 29, 2016, 12:28:30 AM
Autor: NiuWeb
Versión de GM utilizada: Studio 1.4.1657
Descripción: Separa una cadena en un array, tomando como separador la subcadena dada. Por ejemplo, si se separa "hola-que-hace" con el signo "-", devolverá un array con las cadenas "hola", "que" y "hace"
Código:
[gml]
///split(string, separator);
var str = argument0 + argument1;
var sep = argument1;
var sln = string_length(str);
var pln = string_length(sep);

if(sep == "") return false;

var arr, ind = 0;

var i = 1;
while(string_pos(sep, str))
{
    check = string_copy(str, i, pln);
    if(check == sep)
    {
        arr[ind++] = string_copy(str, 1, i - 1);
        str = string_delete(str, 1, i + pln - 1);
        i = 1;
        continue;
    }   
    i++
}
return arr;
[/gml]

Nota: El separador puede ser tanto de uno como de varios caracteres

Argumentos:
str: La cadena a dividir
sep: El separador para dividir.

EDIT: Código optimizado.
Título: Re:División de cadenas por un separador (Explode)
Publicado por: djboro88 en Febrero 29, 2016, 12:53:54 AM
¿El codigo que lo pongo en el apartado de Scripts?
¿Y como me refiero a cada posicion del array?
¿Con arr[0], arr[1], arr[2]...?
Título: Re:División de cadenas por un separador (Explode)
Publicado por: bygdle en Febrero 29, 2016, 01:00:38 AM
Sí, el código lo pones en el apartado de Scripts. Más información, el manual (http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/006_scripts.html) xD
Para obtener lo que recibes, primero debes almacenar el resultado en alguna variable, puesto que el script usa variables locales a él que se borran al finalizarse, aunque antes de eliminarlas las devuelve, claro xD. Algo así:
[gml]
las_divisiones = explode("hola:como:te:va", ":");
[/gml]

Y para referirte a cada dato, debes referirte así:
[gml]
show_message(las_divisiones[0]); //Muestra "hola"
show_message(las_divisiones[1]); //Muestra "como"
//...etc
[/gml]

También puedes apoyarte de la función  array_length_1d, manual aquí (http://docs.yoyogames.com/source/dadiospice/002_reference/001_gml%20language%20overview/array_length_1d.html)
Título: Re:División de cadenas por un separador (Explode)
Publicado por: djboro88 en Febrero 29, 2016, 01:25:20 AM
Tengo lo siguiente:

DRAW
rec_online = explode(result,"|x|");


draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);


Pero me salta este error:
ERROR!!! :: ############################################################################################
FATAL ERROR in
action number 1
of Draw Event
for object obj_version:


Push :: Execution Error - Variable Index [0,1] out of range [1,1] - -1.rec_online(100028,1)
at gml_Object_obj_version_DrawEvent_1 (line 46) - draw_text(280,650,rec_online[0]);
Título: Re:División de cadenas por un separador (Explode)
Publicado por: bygdle en Febrero 29, 2016, 01:28:01 AM
El error es que estás intentando acceder a un índice inexistente del array
Muestra la cadena que el explode recibe, porque si tienes algo como "perro|x|gato" es obvio que soltará un error, puesto que devolverá un array con sólo dos índices (del 0 al 1) que contienen "perro" y "gato", y por lo tanto el índice 2 no existe
Título: Re:División de cadenas por un separador (Explode)
Publicado por: djboro88 en Febrero 29, 2016, 01:31:31 AM
La cadena muestra esto:
Perro|x|Gato|x|Leon|x|

Si escrito la cadena como tal, a mano si que funciona, pero si le indico la variable "result", me salta el error.
Título: Re:División de cadenas por un separador (Explode)
Publicado por: bygdle en Febrero 29, 2016, 01:37:57 AM
Pues ni idea de por qué no te sirve, algo estarás haciendo mal. Lo probé en un proyecto totalmente en blanco, copié el script, lo pequé, creé un objeto vacío y en su evento Draw puse exactamente esto:
[gml]
rec_online = explode("Perro|x|Gato|x|Leon|x|","|x|");

draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);

[/gml]
Ni el más mínimo error


EDITTTT xD No ví la edición en tu mensaje xD... ¿No crees que si manualmente funciona, el error está es en la cadena almacenada en la variable result? Intenta usar un show_message() antes de hacer el explode para comprobar
Título: Re:División de cadenas por un separador (Explode)
Publicado por: djboro88 en Febrero 29, 2016, 01:40:50 AM
Si si, así si que funciona, pero con la variable "result" donde se guarda el resultado de la consulta de la BD.
No funciona.
Título: Re:División de cadenas por un separador (Explode)
Publicado por: bygdle en Febrero 29, 2016, 01:43:05 AM
Entonces el error no es de mi script, es de tu string XD
Revísa la cadena de la variable result antes de hacer el explode, haz un show_message() y corrobora que esté bien
Título: Re:División de cadenas por un separador (Explode)
Publicado por: djboro88 en Febrero 29, 2016, 01:58:52 AM
Ya se cual es el problema.

Se inicializa la variable result con
result = "";

Entonces el primer mensaje muestra " " (vacio).
Y ya el siguiente muestra la cadena.

Pero si tengo que inicializar la variable result, ¿como la inicializo, le cambio el valor y muestro la cadena?
Título: Re:División de cadenas por un separador (Explode)
Publicado por: bygdle en Febrero 29, 2016, 02:01:04 AM
No preguntes eso por aquí, tu problema no tiene absolutamente nada que ver con el script. Pero weno... Sólo haces una condición:
[gml]
if result != ""
{
rec_online = explode(result,"|x|");
draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);
}
[/gml]
Lo que ejecutará el código sólo si la variable result no está vacía
Título: Re:División de cadenas por un separador (Explode)
Publicado por: djboro88 en Febrero 29, 2016, 02:07:46 AM
Porfin !!!  1000 GRACIAS  ;D ;D

Solo un apunte en cuanto al signo de distinto...
if result <> ""
{
rec_online = explode(result,"|x|");
draw_text(180,650,rec_online[0]);
draw_text(280,650,rec_online[1]);
draw_text(380,650,rec_online[2]);
}
Título: Re:División de cadenas por un separador (Explode)
Publicado por: bygdle en Mayo 04, 2016, 10:10:29 PM
He reescrito el script, ahora es un poco más corto y eficiente, aunque sigue funcionando exactamente igual :D