Terminar FORs anidados

Started by Hola, November 25, 2017, 10:16:56 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hola

Buenas, vengo con una simple pregunta, ya lo dice el titulo..., si quiero terminar dos FOR anidados hay que poner 2 break? Ejemplo:


FOR (i=0; i<0; i++)
  FOR (h=0; h<0; h++)


//bla bla...codigo...


BREAK;
BREAK;


END
END


Es así? osea busco terminar ambos for al mismo tiempo.

Drumpi

Nop. Uno de los break debe ir DESPUÉS de uno de los end.
La manera más sencilla de romper los for es, primero, modificar i para que se salga del rango del primer for, y después usar break para forzar la salida del segundo for.
Otra forma es que tengas una variable, yo que sé, "_salir", que valga false, y que antes de ejecutar el break del bucle interior, la pongas a true, y justo tras el end del bucle interior, pones un

if (_salir) break; end

No sé si será cierto, pero a mi me enseñaron que usar break no es una manera "estilosa" de salir de un bucle, y que debíamos buscar siempre una alternativa (generalmente usando IFs, sustituyendo FORs por WHILEs ...), Aun tengo que encontrar algún libro de estilo para saber qué es elegante y qué no :D
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)

Hola

#2
Pues como en la biblia de bennu se cuenta que break es de los que rompen bucles sin vueltas, creí que fue acertado en este caso, usarlo. Siempre he implementado break para romper un bucle..., uhm...,pero volviendo al tema central.., lo que tu dices es hacer algo como lo siguiente?


FOR (i=0; i<50; i++)
  FOR (j=0; j<50; j++)


//codigo...


i=51;
BREAK;


END
END

panreyes

Quote from: Drumpi on November 26, 2017, 12:55:01 AM
No sé si será cierto, pero a mi me enseñaron que usar break no es una manera "estilosa" de salir de un bucle, y que debíamos buscar siempre una alternativa (generalmente usando IFs, sustituyendo FORs por WHILEs ...), Aun tengo que encontrar algún libro de estilo para saber qué es elegante y qué no :D

Absolutamente en desacuerdo xD

Pero sí, en resumen deberías utilizar una variable si necesitas salir de más de un bucle al mismo tiempo.

SplinterGU

#4

salir = 0;

FOR (i=0; i<50 && !salir; i++)
  FOR (h=0; h<50; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
      BREAK;
   end

  END
END



o si en el 2do for interno, luego de que se dispara la salida no tienes mas nada, puedes tambien hacer


salir = 0;

FOR (i=0; i<50 && !salir; i++)
  FOR (h=0; h<50 && !salir; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
   end

  END
END


(pero mejor es la 1era, el 2do era para ejemplificar que la condicion de terminacion de los fors es una expresion)

o


FOR (salir = 0, i =0; i<50 && !salir; i++)
  FOR (h=0; h<50 && !salir; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
   end

  END
END


o


FOR (salir = i = 0; i<50 && !salir; i++)
  FOR (h=0; h<50 && !salir; h++)

   //bla bla...codigo...
   if ( blah )
   then
      salir = 1;
   end

  END
END

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

SplinterGU

#5
nunca pondria i = 51 para salir, porque eso puede servir para saber (fuera del for) si el for se completo o se aborto... con lo que puedo agregarte otro ejemplo...


import "mod_say";

private
    int h, i;

begin

    FOR (h = 50, i =0; i<50 && h == 50 ; i++)
        FOR (h=0; h<50; h++)
            say("i: " + i + " h: " + h) ;
            //bla bla...codigo...
            if ( h == 14 && i == 4 ) // salir
                break;
            end
        END
    END
end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

pero un bloque for llega a su fin y no se repite ¿no? a menos que esté dentro del loop, si no llega al end y se acabo...
¿no?

SplinterGU

Quote from: Futu-block on November 28, 2017, 04:45:17 PM
pero un bloque for llega a su fin y no se repite ¿no? a menos que esté dentro del loop, si no llega al end y se acabo...
¿no?

o no entendi tu pregunta, o la respuesta es "correcto"...

no entendi el punto de la pregunta... el "pero" me desconcierta un poco...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hola

Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

panreyes

Quote from: Hola on November 28, 2017, 07:55:37 PM
Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

Dependiendo del lenguaje de programación puede que compruebe la salida si i==50 o si i<=50. En el primer caso, provocaría un bucle infinito.
En algunos lenguajes FOR se utiliza como nuestro FROM.

SplinterGU

Quote from: Hola on November 28, 2017, 07:55:37 PM
Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

respuesta (y ejemplo)

Quote from: SplinterGU on November 27, 2017, 06:26:11 PM
nunca pondria i = 51 para salir, porque eso puede servir para saber (fuera del for) si el for se completo o se aborto... con lo que puedo agregarte otro ejemplo...


import "mod_say";

private
    int h, i;

begin

    FOR (h = 50, i =0; i<50 && h == 50 ; i++)
        FOR (h=0; h<50; h++)
            say("i: " + i + " h: " + h) ;
            //bla bla...codigo...
            if ( h == 14 && i == 4 ) // salir
                break;
            end
        END
    END
end

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

Futu-block

Quote from: SplinterGU on November 28, 2017, 05:37:29 PM
Quote from: Futu-block on November 28, 2017, 04:45:17 PM
pero un bloque for llega a su fin y no se repite ¿no? a menos que esté dentro del loop, si no llega al end y se acabo...
¿no?

o no entendi tu pregunta, o la respuesta es "correcto"...

no entendi el punto de la pregunta... el "pero" me desconcierta un poco...

Vale, o no sé lo que "Hola" quiere hacer, o yo planteo diferente caso:
Si creo un proceso donde el pongo despues del begin + coordenadas + variables el bloque for en vez de poner un loop, cuando llegue al end debe de morir el proceso, ¿no? porque se estará ejecutando mientras esté funcionando el bloque for ¿no? a eso me refiero

y otra cosa ya que estoy en caliente, cuando un proceso llega a su fin, ¿se elimina? se que da en reserva?? está ahí aunque no se vea???
¿que el pasa?

Hola

Quote from: SplinterGU on November 29, 2017, 07:06:47 AM
Quote from: Hola on November 28, 2017, 07:55:37 PM
Perdón por no responder antes, tuve que iniciar sesión desde una pagina anónima porque me decía "La sesión ha expirado" o algo así. Bueno, gracias por las respuestas, tomare un poco de lo que dice splinter..., pero me surge la duda de por que no es conveniente usar i=51 para detener el otro FOR.., ¿?
Gracias por las respuestas.

respuesta (y ejemplo)

Quote from: SplinterGU on November 27, 2017, 06:26:11 PM
nunca pondria i = 51 para salir, porque eso puede servir para saber (fuera del for) si el for se completo o se aborto... con lo que puedo agregarte otro ejemplo...


import "mod_say";

private
    int h, i;

begin

    FOR (h = 50, i =0; i<50 && h == 50 ; i++)
        FOR (h=0; h<50; h++)
            say("i: " + i + " h: " + h) ;
            //bla bla...codigo...
            if ( h == 14 && i == 4 ) // salir
                break;
            end
        END
    END
end



Si..., ya había leído..., pero si yo pongo i = 51 no se supone que tras el break del for interior, el for exterior realice la comprobación una vez mas y al ser i = 51 se termine también?

gecko

Si, saldría también, pero si más adelante te interesa el dato de saber hasta que bucle se llegó a ejecutar, ese dato lo perdiste cuando le cambiaste el valor a i. En cambio si usas otra condicion para salir del bucle, la variable i va a conservar ese ultimo valor ejectutado por el for.

Es un dato extra que según tu situación puede servirte o no.
Torres Baldi Studio
http://torresbaldi.com

Hola

Ahh entiendo, como dato extra, buen punto. Claro yo como nunca en ningún programa requerí de utilizar esa info del for, bueno, ni lo tuve en cuenta...
Pero si yo realmente no voy a utilizar ese dato..., poner i = 51 no facilita todo el proceso? digo, en lugar de utilizar la var..