Go Down

Topic: Problema com "goto" (Read 1 time) previous topic - next topic

sustirijiyo

Hola

Yo se que la mayoria me diran q eso de usar el goto no es lo mas indicado, aun asi quisiera aprender a utilizarlo y el problema es q tengo un pequeño programa de prueba pero no se por q la palabra no me la toma como codigo, osea q pues no se cambia de color, y bueno veo q la sintaxis es asi simple (goto label;) bueno quisiera saber si en realidad estoy mal o q necesito para utilizarla bien, un ejemplo me vendria de maravilla.

Gracias y saludos.

curro92

Hola,
¿por qué no pones tu programa, para que veamos en qué falla?


sustirijiyo

ok este fue el primer programa q hice... despues lo modifique tanto q le quite los goto y le puse muchas cosas diferentes jeje

int ledPin1 = 8;
int ledPin2 = 9;
int ledPin3 = 11;
int ledPin4 = 12;
int fotoRes = 0;
int val = 0;

void setup()

{
   pinMode (ledPin1, OUTPUT);
   pinMode (ledPin2, OUTPUT);
   pinMode (ledPin3, OUTPUT);
   pinMode (ledPin4, OUTPUT);
   Serial.begin (9600);
}

void loop()
{
   val= Serial.read()-48;

   if(val =='1')
   {
      goto encled1;
   }
   
   else if (val =='2')
   {
      goto encled2;
   }

   else if (val =='3')
   {
      goto encled3;
   }

   else if (val =='4')
   {
      goto encled4;
   }

   else {goto finFin;}

   encled1:
      {digitalWrite(ledPin1, HIGH);
      goto finFin;}
   encled2:
      {digitalWrite(ledPin2, HIGH);
      goto finFin;}
   encled3:
      {digitalWrite(ledPin3, HIGH);
      goto finFin;}
   encled4:
      {digitalWrite(ledPin4, HIGH);
      goto finFin;}
   
   finFin:
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, HIGH);
      digitalWrite(ledPin4, HIGH);
      delay(500);
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, LOW);
      digitalWrite(ledPin4, LOW);
}




sustirijiyo

tambien me gustaria q me explicaran si es posible los usos e funciones q uno mismo crea para despues llamarlas a lo largo de un programa, para utilizarlos en lugar del goto, gracias

Sergegsx

el uso de funciones esta ampliamente explicados en la web de arduino y en miles de tutoriales por la red.

si ahora has cambiado el programa y has quitado los GOTO, porque no pones el codigo nuevo? por cierto, buena decisión quitar los GOTO.

PascuaL

#5
Nov 29, 2012, 12:07 pm Last Edit: Nov 29, 2012, 12:15 pm by PascuaL Reason: 1
Goto sólo funciona para arriba, es decir, no puede saltar hacia una parte de código que esté por debajo de la sentencia.

Code: [Select]

referencia;
http://arduino.cc/es/Reference/Goto


if (tu no sabes usar goto)
{ lees la referencia
goto referencia;
}



Respecto a las funciones, el goto solo se puede usar dentro de una función. No se podrá llamar un goto que no conste en la misma función de la llamada.

Mitxel

La instrucción "goto" no debería ser nunca necesaria.

Los corchetes {} crean un bloque de código que se ejecuta como un conjunto, de arriba abajo.
Una estructura de control, como por ejemplo un if() puede hacer que se ejecute una instrucción
suelta o un bloque de código entre corchetes. Cuando solo se ejecuta una instrucción, no son necesarios los corchetes.

Por ejemplo:

Code: [Select]
if (val =='2') digitalWrite(ledPin2, HIGH);

o, un bloque

Code: [Select]
if (val =='2')
{
digitalWrite(ledPin2, HIGH);
Serial.println("LedPin2 activo");
}


Los grupos if..else anidados pueden dar lugar a un código muy confuso y que puede contener errores fácilmente. Creo que eso es
lo que le pasa a tu código. Se trata de identificar a que if corresponde cada else y eso suele ser complicado.

Como los diferentes valores de "val" son mutuamente excluyentes (solo se ejecuta uno de los if), creo que el código podría funcionar como sigue:

Code: [Select]
void loop()
{
   val= Serial.read()-48;

   if(val =='1') digitalWrite(ledPin1, HIGH);
   if(val =='2') digitalWrite(ledPin2, HIGH);
   if(val =='3') digitalWrite(ledPin3, HIGH);
   if(val =='4') digitalWrite(ledPin4, HIGH);

    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin4, HIGH);
   
    delay(500);
   
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
}


Para este tipo de estructuras en las que hay varios comportamientos posibles según el "caso" suele emplearse la instrucción switch...case

El código quedaría asi:

Code: [Select]
void loop()
{
   val= Serial.read()-48;
   
   switch(val)
    {
    case '1': digitalWrite(ledPin1, HIGH); break;
   
    case '2':
    digitalWrite(ledPin2, HIGH);
    Serial.println("ledPin2 activado"); // Instrucciones hipotéticas
    delay(10);
    break;
   
    case '3': digitalWrite(ledPin3, HIGH); break;
   
    case '4': digitalWrite(ledPin4, HIGH); break;   
   
    default: Serial.println("Valor de val ilegal");
    }

escribe4Pines(HIGH);
   
    delay(500);
   
escribe4Pines(LOW);
}

void escribe4Pines(int valor)
{
digitalWrite(ledPin1, valor);
    digitalWrite(ledPin2, valor);
    digitalWrite(ledPin3, valor);
    digitalWrite(ledPin4, valor);
}


(He incluido la función escribe4Pines() para ilustrar cómo se definen y usan funciones)

sustirijiyo

wow  muchas gracias a todos me han ayudado bastante

Mixtel
me has sacado de una buena duda q era las funciones, pero aun hay varias q traigo atoradas en la cabeza,bueno lo q pasa es q mi programa final tiene varios procesos y la mayoria son de ciclos for y while (y algunos if else y cases tambien), me parecia buena idea crear estos procesos cada uno por su parte y despues llamarlos con el goto (ahora cambiandolos por funciones), aqui les dejo un diagrama asi medio simple de lo q seria el proceso de mi programa (espero pr q es la primera ves q trato de poner una imagen aqui jaja)

Go Up