¿Esto es normal? no actualiza valor

Started by Drumpi, January 22, 2011, 10:28:12 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

Una cosa que no sé di es normal o no. Tengo este código:
[code language="bennu"]global_opt=0;
               while (global_opt==0)
                   port_menu=global_menu(2,4,"CONFIGURATION","","Keys configuration","Joy configuration","Return");
                   while (exists(port_menu)) frame; end
                   
                   switch (global_opt)
                   case 2:
                       
                       say("Global_opt=2");
                       global_opt=0;
                   end
                   case 3:
                       
                       say("Global_opt=3");
                       //global_opt=0;
                   end
                   end //switch
                   frame;
               end[/code]

Bien, global_opt es una variable global que es modificada desde global_menu.
Global_menu es un proceso que hace un menú en función de los datos que le pasamos (el número de la primera opción, el número de la última, y cinco strings que pueden ser opciones o no (según los dos primeros valores que he mencionado), que usa los cursores y el boton intro para seleccionar.

Bien, la primera opción es la 2, que ejecutaría algo y luego hago que se vuelva a repetir el menu, poniendo global_opt a cero.
El caso es que si no pongo el frame dentro del bucle, se me genera un bucle infinito del que no sale, como si la segunda vez que se llama a global_menu no asignase su ID a la variable port_menu, y por lo tanto, se salta el bucle de comprobación:

while (exists(port_menu)) frame; end

Porque no encuentra el proceso (tiene el valor de la iteración anterior, pero no la nueva ID).

¿Es así o hay algo mal?

Se podría sustituir el menú por un proceso estilo:

global_menu (int a, int b, string c, string d, string e, string f, string g)
begin
while (key(_enter)) frame; end
while (!key(_enter)) frame; end
global_opt=2;
end

DATOS Técnicos: versión r131 de windows sobre XP64
EDIT: probado en la r201 con identicos resultados, bien si pongo el frame, bucle infinito si lo quito.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

si lo quitas es correcto que de bucle infinito.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Noivern

¿y si en vez de proceso lo haces como función con el while() y el frame dentro de esta? y que retorne la opcion elegida.

Drumpi

No me gusta meter frames en las funciones, no sé, es una de mis manías.

De todas formas, no entiendo por qué hace esto del bucle infinito ¿no se puede obtener el ID de dos procesos distintos en el mismo frame sobre la misma variable o es que hoy he programado demasiado y no veo nada? (la segunda opción es muy plausible, hoy me he hinchado, y mañana podría tener algo para que lo probase Momia).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Quote from: Drumpi on January 23, 2011, 02:29:23 AM
No me gusta meter frames en las funciones, no sé, es una de mis manías.

De todas formas, no entiendo por qué hace esto del bucle infinito ¿no se puede obtener el ID de dos procesos distintos en el mismo frame sobre la misma variable o es que hoy he programado demasiado y no veo nada? (la segunda opción es muy plausible, hoy me he hinchado, y mañana podría tener algo para que lo probase Momia).

a ver... si tenes un loop/while/lo que sea, necesitas un frame si este depende de otros procesos... podes llamar por ejemplo a una funcion o usar un for para setear algunas cosas, pero todo bucle debe salir limpiamente y dentro del mismo frame sin depender de otros procesos (no funciones), si depende de otros procesos para salir, entonces no lo podes hacer dentro del mismo frame...

como sea, ya sabes bien que es dificil ayudar sin un codigo completo/compilable que muestre tu problema/inquietud.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Creo que esto es compilable. Tampoco quiero pasarte el código entero porque incluso yo me pierdo de lo grande que es, y no tengo tiempo para aislar el error (lo siento, tengo que aprender java en menos de un mes, y llevo dos días que con tanto ejercicio sólo he avanzado tres temas de 52).

Pero vamos, que con un frame está solucionado, en el peor caso se produciría un glitch, pero como en medio va otro menú, pues nada.
El código ya me funciona en PC, pero no me responde en Wiz (antes lo hacía, a saber qué me he cargado). Tampoco quiero dedicarle demasiado tiempo, pues necesito otras cosas para seguirlo, y esto sólo es 1/3 de lo que necesito para re-lanzarlo.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

Para menús sí que te recomiendo usar FUNCTION con FRAME, para cualquier otra cosa no, pero para el tema de menús si no se hace feo...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Por lo general, lo que hago es que el proceso padre se congela tras llamar al hijo, y es el hijo quien lo despierta tras acabar su ejecución (salvo que el hijo dure un único frame, en ese caso uso una función).
Lo que pasa es que este código es anterior a este método. Empecé a usarlo en "Screen Break Time" con excelentes resultados, y hay muchas cosas de SBT que debo meter en este, sobre todo porque luego tengo que ampliarlo de forma no lineal (la evolución del código, qué cosas :D).

Por cierto, si anda Momia por aquí, me gustaría que diese una señal de vida, para que lo pruebe, ya que me lo pidió hace bastante tiempo ^^U
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)