Pages: [1]   Go Down
Author Topic: Problema com "goto"  (Read 844 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 711
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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);
}



Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1407
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 410
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
« Last Edit: November 29, 2012, 06:15:14 am by PascuaL » Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
if (val =='2') digitalWrite(ledPin2, HIGH);

o, un bloque

Code:
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:
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:
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)   
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)


* Diagrama.png (13.99 KB, 485x664 - viewed 6 times.)
Logged

Pages: [1]   Go Up
Jump to: