Los strings también son mala gente

Started by Arcontus, May 27, 2018, 01:22:56 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Quote from: SplinterGU on May 30, 2018, 01:22:33 AM
NOTA: 32000 no tiene nada que ver con 32768, simplemente es casualidad que se reuse el mismo id cerca de ese numero... de hecho a mi me falla a los 36500 exactos, creados...

ya esta explicado el problema, debes controlar los ids de textos que creas, si haces un delete_text(0) se borra todo, write* retorna 0 ante error... (la wiki esta mal), luego de borrar todo los ids se reusan, si tu logica no limpia el id, en algun momento va a asignar ese id a otro texto, y tu logica hara cosas pensando que es otro texto que ya no existe...
Bien visto SplinterGU!
¿Y en este caso podría explicar que provocara un crash? Por ejemplo tratando de borrar un ID que ya ha sido borrado por el delete_text(0).

Con el nuevo código todo va estupendamente:
import "mod_key"
import "mod_video"
import "mod_text"
import "mod_map"
import "mod_string"
import "mod_rand"
import "mod_say"


PROCESS creaTexto(int miX, int miY, string cadena)
PRIVATE
    int txtid;
    int temporizador;
    string miCadena;
END
BEGIN
    txtid = -1;
    x = miX;
    y = miY;
    miCadena = cadena;
    temporizador = 360;
    txtid = write_string(0, x, y, 0, &miCadena);

    while(temporizador > 0)
        temporizador--;
        move_text(txtid, x, y);
        FRAME;
    END
OnExit:
    if (txtid > 0) delete_text(txtid); END
    //say(cadena);
END

PROCESS main()
PRIVATE
    int indice, contador, contador2, txtid;
    string miCadena, micadena2;

END
BEGIN
    set_fps(200,0);
    set_mode(800,600,32, mode_window);
    x = 30;
    y = 550;
    txtid = write_string(0, 30,550, 0, &micadena2);
    while(!(key(_ESC)))
            contador2++;
            for (indice = 0; indice < 100; indice++)
                contador++;
                miCadena = "Hola caracola: " + contador;
                miCadena2 = "Total: " + contador;
                creaTexto(rand(10,200), rand(10,500), miCadena);
            END
            move_text(txtid, x, y);
            say (miCadena2);
        FRAME;
    END
END

Ahora he de cambiar nuevamente de >= a > en la detección de ID's en tooodo mi proyecto.
¿Alguien con derechos de edición podría corregir la wiki para tener correcta la documentación?

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Arcontus

Quote from: Arcontus on May 30, 2018, 08:09:15 AM
Quote from: SplinterGU on May 30, 2018, 01:22:33 AM
NOTA: 32000 no tiene nada que ver con 32768, simplemente es casualidad que se reuse el mismo id cerca de ese numero... de hecho a mi me falla a los 36500 exactos, creados...

ya esta explicado el problema, debes controlar los ids de textos que creas, si haces un delete_text(0) se borra todo, write* retorna 0 ante error... (la wiki esta mal), luego de borrar todo los ids se reusan, si tu logica no limpia el id, en algun momento va a asignar ese id a otro texto, y tu logica hara cosas pensando que es otro texto que ya no existe...
Bien visto SplinterGU! y te voy a dar un karmazo!
¿Y en este caso podría explicar que provocara un crash? Por ejemplo tratando de borrar un ID que ya ha sido borrado por el delete_text(0).

Con el nuevo código todo va estupendamente:
import "mod_key"
import "mod_video"
import "mod_text"
import "mod_map"
import "mod_string"
import "mod_rand"
import "mod_say"


PROCESS creaTexto(int miX, int miY, string cadena)
PRIVATE
    int txtid;
    int temporizador;
    string miCadena;
END
BEGIN
    txtid = -1;
    x = miX;
    y = miY;
    miCadena = cadena;
    temporizador = 360;
    txtid = write_string(0, x, y, 0, &miCadena);

    while(temporizador > 0)
        temporizador--;
        move_text(txtid, x, y);
        FRAME;
    END
OnExit:
    if (txtid > 0) delete_text(txtid); END
    //say(cadena);
END

PROCESS main()
PRIVATE
    int indice, contador, contador2, txtid;
    string miCadena, micadena2;

END
BEGIN
    set_fps(200,0);
    set_mode(800,600,32, mode_window);
    x = 30;
    y = 550;
    txtid = write_string(0, 30,550, 0, &micadena2);
    while(!(key(_ESC)))
            contador2++;
            for (indice = 0; indice < 100; indice++)
                contador++;
                miCadena = "Hola caracola: " + contador;
                miCadena2 = "Total: " + contador;
                creaTexto(rand(10,200), rand(10,500), miCadena);
            END
            move_text(txtid, x, y);
            say (miCadena2);
        FRAME;
    END
END

Ahora he de cambiar nuevamente de >= a > en la detección de ID's en tooodo mi proyecto.
¿Alguien con derechos de edición podría corregir la wiki para tener correcta la documentación?
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

no creo que el crash tenga que ver con esto... seguramente si manejas punteros se deba a algo de eso... al momento no hay algun bug conocido que pueda probar un crash... salvo el bug del render que a veces con rotaciones y sizes dibuja cualquier cosa...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Quote from: SplinterGU on May 30, 2018, 09:52:15 PM
no creo que el crash tenga que ver con esto... seguramente si manejas punteros se deba a algo de eso... al momento no hay algun bug conocido que pueda probar un crash... salvo el bug del render que a veces con rotaciones y sizes dibuja cualquier cosa...
¿No? ¿Incluso mandando un delete_text(id) a una id que ha sido borrada por un delete_text(0) previamente? ¿Esto está protegido de alguna manera para que el programa no haga nada?
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

FreeYourMind

que version de bennugd estas usando ? creo recordar que lo de error al pagar id's no existentes hace tiempo que se ignora para que no salte error

Arcontus

Quote from: FreeYourMind on May 31, 2018, 08:50:15 AM
que version de bennugd estas usando ? creo recordar que lo de error al pagar id's no existentes hace tiempo que se ignora para que no salte error
He actualizado recientemente, pero es posible que estuviera utilizando una versión afectada. He hecho tantos cambios ya que ni se como se ha arreglado el tema.Por cierto, sonara muy noob pero: ¿hay algún comando para ver la versión de bennu que estoy usando?
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

Quote from: Arcontus on May 31, 2018, 08:41:43 AM
Quote from: SplinterGU on May 30, 2018, 09:52:15 PM
no creo que el crash tenga que ver con esto... seguramente si manejas punteros se deba a algo de eso... al momento no hay algun bug conocido que pueda probar un crash... salvo el bug del render que a veces con rotaciones y sizes dibuja cualquier cosa...
¿No? ¿Incluso mandando un delete_text(id) a una id que ha sido borrada por un delete_text(0) previamente? ¿Esto está protegido de alguna manera para que el programa no haga nada?


por supuesto... esta protegido...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: FreeYourMind on May 31, 2018, 08:50:15 AM
que version de bennugd estas usando ? creo recordar que lo de error al pagar id's no existentes hace tiempo que se ignora para que no salte error

no recuerdo eso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

era con los sonidos creo recordar, matar un sonido inexistente

SplinterGU

Quote from: Arcontus on May 31, 2018, 10:22:35 AM
Quote from: FreeYourMind on May 31, 2018, 08:50:15 AM
que version de bennugd estas usando ? creo recordar que lo de error al pagar id's no existentes hace tiempo que se ignora para que no salte error
He actualizado recientemente, pero es posible que estuviera utilizando una versión afectada. He hecho tantos cambios ya que ni se como se ha arreglado el tema.Por cierto, sonara muy noob pero: ¿hay algún comando para ver la versión de bennu que estoy usando?


si, corre el bgdi sin argumentos y te muestra el numero de version y demas
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: FreeYourMind on June 01, 2018, 11:50:23 AM
era con los sonidos creo recordar, matar un sonido inexistente

puede ser, pero el esta preguntando de textos
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Quote from: SplinterGU on June 01, 2018, 12:01:11 PM
Quote from: FreeYourMind on June 01, 2018, 11:50:23 AM
era con los sonidos creo recordar, matar un sonido inexistente

puede ser, pero el esta preguntando de textos
Llevo varios días y muchas horas de juego sin un crash y he vuelto a activar los registros de los textos. He cambiado cosas en mi código, como lo del >= por > en los id's de textos, y descartando esto nada que a primera vista puediera reflejar un crash. En fin, a ver si ya esta todo ok y no vuelve a dar por saco :D
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2