Go Down

Topic: Ejemplo 'goto' (Read 6670 times) previous topic - next topic

Alcafuz

Hola amigos, antiguamente trabajaba con Picbasic, y en ese lenguaje utilizaba el 'goto' para algunas rutinas, he intentado utilizarlo en arduino pero algo me falla, alguien tiene algun ejemplo brevisimo de como utilizarlo correctamente???(que no sea el del reference obvio), lo que no comprendo es como regresar del goto, en basic utilizaba 'return' para volver al 'lugar'  que sigue al salto del goto.

Gracias!

curro92

#1
Feb 22, 2011, 07:36 am Last Edit: Feb 22, 2011, 07:38 am by curro92 Reason: 1
En C se recomienda no usar mucho el goto. Yo he solido emplear alguna vez cuando me interesa salir de bucles anidados:
Code: [Select]

for(a=0;a<9999;a++)
{
   for(b=0;b< 9999;b++)
  {
      (if(x == 20)
          goto marca1;
  }
}

marca1:;
// continúa el código



No conozco el uso de return más que para volver de una función.


chiva

goto simplemente salta, no creo que guarde la dirección en la pila de llamadas.

De todas maneras, C ya tiene un control de flujo muy bueno que hace innecesario el uso de goto, que puede ser una fuente de problemas muy grande.
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Alcafuz

Gracias a todos por las respuestas;
entonces no puedo hacer algo como lo siguiente???

Code: [Select]

for(a=0;a<9999;a++)
{
    for(b=0;b< 9999;b++)
   {
       (if(x == 20)
           goto marca1;
           "linea siguiente"
           //mas codigo
         
   }
}

marca1:;
//codigo marca1
"vuelve a siguiente linea'"


la idea es que una vez ejecutado el trozo de codigo llamado 'marca1', el programa vuelva a la linea siguiente a la que estaba justo antes de que se cumpliera la condicion para el goto.

(espero se entienda)

Saludos!



curro92

Hola,
creo que sí podrías volver, pero podría resultar muy difícil predecir cómo acabará el programa

Code: [Select]

for(a=0;a<9999;a++)
{
    for(b=0;b< 9999;b++)
   {
       (if(x == 20)
           goto marca1;
           marca2:;
           //mas codigo
         
   }
}

marca1:;
//codigo marca1
goto marca2;

chato_sat

Hola,
no sería más fácil crear una función y saltar a ella, en lugar de llamar a goto??

Saludos,
chato_sat

Alcafuz

Entiendo, al parecer se hace mas complicado el uso del goto al no existir un 'retorno' incluido en la propia definición del goto en Arduino.

chato_sat, podrías profundizar un poco en lo de la función?, la verdad es que no se usarlas.

chato_sat

Pues puedes crear una función y llamarla desde cualquier parte del programa. Cuando se llama a una función esta se ejecuta y una vez que termina la función el vuelve el flujo del programa a donde se llamó a la función.

Por ejemplo:
Code: [Select]

for(a=0;a<9999;a++)
{
    for(b=0;b< 9999;b++)
   {
       if(x == 20)
           funcion1();

       //mas codigo
         
   }
}

void funcion1() {
}


cuando se cumple que x==20 se ejecuta lo que haya en funcion1 y cuando termine se seguirá ejecutando el for

Saludos,
chato_sat

Alcafuz

Ok, muchas gracias, si vuelve automaticamente al punto anterior, es justamente lo que busco.

Ahora, he visto que las funciones las definen tanto antes del void setup(), como al final del codigo, da lo mismo? o tiene alguna diferencia en el funcionamiento????

Saludos!

chato_sat

El funcionamiento es el mismo la declares antes del setup() o después.

Saludos,
chato_sat

Anael

Buenos días,
estoy intentando hacer un GOTO en el software arduino, pero de una función a otra, es decir tengo

void setup(){

}

void loop(){
a:

}

void counter(){

if( condicion){goto a; }
}
esto es lo que quiero, pero el software me dice que "( a ) es usado pero no esta definido"

por lo tanto me gustaría saber como lo puedo hacer.
Gracias

mafesolutions

Code: [Select]
void setup(){

}

void loop(){
a:

}

void counter(){

if( condicion){goto a; }
}


en la funcion por ejemplo vos para llamarla pondrias en el loop counter() y para volver al loop podrias poner que si no se cumple la condicion valla a loop() y retorne a leer el codigo ! seria algo como esto

Code: [Select]


void setup(){

}

void loop(){
a:

}

void counter(){

if( condicion)
{loop() // u a otra funcion que quieras que cumpla si tu condicion no se da !; }

surbyte

quieres hacer un branch o salto a una dirección o número de línea. Eso no puede hacerse.
Tampoco puedes llamar a loop() o setup()
Si eres el mismo que puso setup() en otro post, te recomiendo que uses watchdog.
Puede que me equivoque.

NOTA: Lee las normas. Este post tiene mas de 120 dias sin movimiento (Feb 22, 2011, 04:27 pm) . Lo mejor es que crees un nuevo hilo y plantees tu duda
Si lo haces pon tu código y explica bien porque necesitas ir a tal linea de programa.

Go Up