[SOLUCIONADO]...Consulta sobre: instruccion goto

Hola a Todos

En el código adjunto, me notifica el siguiente error en la utilización de goto.(en la función: void fin_carrera() )
El resto del código funciona bien.

copia de mensaje de error:

...../Arduino:1.8.3 (Windows 10), Tarjeta:"Arduino/Genuino Uno"

C:\DATOS INICIO\DATOS\ARDU-ARCHIVOS\A PROGRAMAS CREADOS\M_CONSULTA_FORO\M_CONSULTA_FORO.ino: In function 'void fin_carrera()':

M_CONSULTA_FORO:187: error: label 'EtiquetaGOTO' used but not defined

  • goto EtiquetaGOTO;  *
    
  •      ^*
    

exit status 1
label 'EtiquetaGOTO' used but not defined

Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias...../
/......
.
.

Podéis aclarar su utilización ???

Un saludo !!!! :cocktail: :cocktail:
.
.
.

/*
 * 
 * MOTOR PAP  IF - SWITCH - FIN DE CARRERA.
 * 
 * Al pulsar (2) INICIA programa
 * Se suceden 4 movimientos alternativos del motor con parada intermedia.
 * FINAL con un tiempo de REPOSO antes de volver a quedar a la espera de una nueva pulsacion.
 *  
 * Pin (7) solamente enciende mientras actua programa.
 * Fin de carrera(4) interrumpe y finaliza programa.
 * 
 */
 // *****************************  ENGRAL agosto 2023  *****************************     
      
      const int REPOSO  = 2000;      // REPOSO final
      const int APAGADO  = 500;      // tiempo apagado final de motor y entre cambios de sentido.
      const int INTERMIT = 200;      // tiempo intermitente.
      const int INTERVALO  = 3;      // Tiempo de INTERVALO entre pasos en milisegundos (Velocidad del Motor)
      
      int PasosB1 = 100;
      int PasosS1 = 100;
      int PasosB2 = 100;
      int PasosS2 = 100;
      
       int Variable = 0; 

 void setup()
{                      
      pinMode(12, OUTPUT);    // Pin 11 intermitente
      pinMode(11, OUTPUT);    // Pin 11 conecta a IN4 de CI- ULN200
      pinMode(10, OUTPUT);    // Pin 10 conecta a IN3
      pinMode( 9, OUTPUT);    // Pin  9 conecta a IN2     
      pinMode( 8, OUTPUT);    // Pin  8 conecta a IN1
      pinMode( 7, OUTPUT);    // Pin  7 enciende mientras funciona motor
      pinMode( 2,  INPUT);    // Pin  2 Pulsador
      pinMode( 4,  INPUT);    // Pin  4 Fin Carrera RESET
      
      Serial.begin(9600);     
      Serial.println("");
      Serial.println("========   M_MOTOR_PAP_PULS_FIN_CARRERA  =============");
      Serial.println("");
} 

void loop() 
{       
     if  (digitalRead(2) == HIGH) // Pulsador en HIGH activa el programa.
  {  
     IMPRIVARIABLE(); 
    
  switch(Variable) // -.-.-.-.-.-EMPIEZA SWITCH.-.-.-.-.-.-.-                     
 {
    case 0:  // ********************************************************       
     for (int Mot = 0; Mot < PasosB1; Mot++) // FOR: Repite los pasos PasosB1 "X"veces BAJA 1
  {  
     fin_carrera();  
     digitalWrite(7,HIGH);
     BAJA();
  }                 
     Variable++;         
    case 1:  // *****************************************************
   apagado(); 
   IMPRIVARIABLE(); 
   
    for (int Mot = 0; Mot < PasosS1; Mot++) // FOR: Repite los pasos PasosS1 "X"veces SUBE 1.
  {  
     fin_carrera(); 
    SUBE(); 
  }               
    Variable++;   
    case 2:  //*******************************************************
   apagado();
   IMPRIVARIABLE();    
    for (int Mot = 0; Mot < PasosB2; Mot++) // FOR: Repite los pasos PasosB2 "X" veces BAJA 2   
  { 
     fin_carrera(); 
    BAJA();  
  }      
    Variable++;     
    case 3:  // *****************************************************
    apagado();
    IMPRIVARIABLE();
   
    for (int Mot = 0; Mot < PasosS2; Mot++) // FOR: Repite los pasosS2 "X" veces SUBE 2.
  {     
     fin_carrera();    
    SUBE(); 
  }       
    if (Variable >= 3)
  {
    EtiquetaGOTO:        //.................... AQUI ACTUA : GOTO
    Variable = 0;        // Reinicia "Variable" a "0"
    digitalWrite(7,LOW); // Apaga led 7
    apagado();           // Apaga todo
    Serial.println("===============  FIN DE PROGRAMA  ==================="); 
  }          
    delay (REPOSO );     // Tiempo de REPOSO FINAL.
  }     
 } 
    else
 {
   Serial.println("========================  TOCA PULSADOR"); 
   interm();
 }
} 
 // *************************************  FUNCIONES  **********************************
void IMPRIVARIABLE()
{
 Serial.print("Variable: "); 
 Serial.println(Variable);  
}

void BAJA()
{                          // Pasos  BAJA 
 digitalWrite(11, LOW); // Pasos motor
 digitalWrite(10, LOW);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, HIGH);  
 delay(INTERVALO); 
   
 digitalWrite(11, LOW); 
 digitalWrite(10, HIGH);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, LOW);  
 delay(INTERVALO); 
 
 digitalWrite(11, HIGH); 
 digitalWrite(10, HIGH);  
 digitalWrite(9, LOW);  
 digitalWrite(8, LOW);  
 delay(INTERVALO); 
 
 digitalWrite(11, HIGH); 
 digitalWrite(10, LOW);  
 digitalWrite(9, LOW);  
 digitalWrite(8, HIGH);  
 delay(INTERVALO);  
}

void SUBE()
{                        // Pasos  SUBE
 digitalWrite(11, HIGH); // Pasos motor
 digitalWrite(10, HIGH);  
 digitalWrite(9, LOW);  
 digitalWrite(8, LOW);  
 delay(INTERVALO); 
 
 digitalWrite(11, LOW); 
 digitalWrite(10, HIGH);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, LOW);  
 delay(INTERVALO); 
 
 digitalWrite(11, LOW); 
 digitalWrite(10, LOW);  
 digitalWrite(9, HIGH);  
 digitalWrite(8, HIGH);  
 delay(INTERVALO); 
 
 digitalWrite(11, HIGH); 
 digitalWrite(10, LOW);  
 digitalWrite(9, LOW);  
 digitalWrite(8, HIGH);  
 delay(INTERVALO); 
}       
void apagado()
{                         // Apagado del Motor
 digitalWrite(11, LOW); 
 digitalWrite(10, LOW);  
 digitalWrite(9, LOW);  
 digitalWrite(8, LOW); 
 delay(APAGADO);  
 }
 
void interm()
{   
    digitalWrite(12, HIGH);    
    delay(INTERMIT);
    digitalWrite(12, LOW);
    delay(INTERMIT);    
}

void fin_carrera()
{
 if  (digitalRead(4) == LOW)
 {
    Serial.println("=======================  FIN CARRERA !!!");        
    goto EtiquetaGOTO;  
}
}
//  ************************************  FIN FUNCIONES   ********************************

// ======================================   FIN   ====================================

"La instrucción goto transfiere el control a la localización especificada por la etiqueta.
La instrucción goto debe estar en la misma función que la etiqueta a la que se refiere, puede aparecer antes o después de la etiqueta
."

Fuente: Instrucción goto - cppreference.com

1 Like

@ENGRAL te lo diré claro: nunca uses goto. Busca programas de Arduino y verás que difícilmente aparecerá un goto. Si alguna vez te encuentras con un programa con goto, ten por seguro que no es buen ejemplo de programación.

Mi consejo: modifica el programa para no tener que usar el goto. Y olvida que el goto existe.

1 Like

Tienes muchos errores en tu código.
Para empezar un switch case siempre termina un case con un break, de lo contrario se ejecuta todo lo que tienes hasta el final.
En tu caso si ingresas con case 1 ejecutas todo hasta el final y lo mismo con los demás.
Eso debes corregirlo.
Esta tan confuso tu código que no pude arreglarlo

La parte del switch case quedaría asi

switch (Variable)  {
      case 0:
        // FOR: Repite los pasos PasosB1 "X"veces BAJA 1
        for (int Mot = 0; Mot < PasosB1; Mot++) {
          fin_carrera();
          digitalWrite(7, HIGH);
          BAJA();
        }
        Variable++;
        break;
      case 1:
        apagado();
        IMPRIVARIABLE();

        // FOR: Repite los pasos PasosS1 "X"veces SUBE 1.
        for (int Mot = 0; Mot < PasosS1; Mot++) {
          fin_carrera();
          SUBE();
        }
        Variable++;
        break;
      case 2:
        apagado();
        IMPRIVARIABLE();
        // FOR: Repite los pasos PasosB2 "X" veces BAJA 2
        for (int Mot = 0; Mot < PasosB2; Mot++) {
          fin_carrera();
          BAJA();
        }
        Variable++;
        break;
      case 3:
        apagado();
        IMPRIVARIABLE();
        // FOR: Repite los pasosS2 "X" veces SUBE 2.
        for (int Mot = 0; Mot < PasosS2; Mot++) {
          fin_carrera();
          SUBE();
        }
        if (Variable >= 3) {
EtiquetaGOTO:                    //.................... AQUI ACTUA : GOTO
          Variable = 0;          // Reinicia "Variable" a "0"
          digitalWrite(7, LOW);  // Apaga led 7
          apagado();             // Apaga todo
          Serial.println("===============  FIN DE PROGRAMA  ===================");
        }
        delay(REPOSO);  // Tiempo de REPOSO FINAL.
        break;
    }

Y en el medio esta ese goto con su etiqueta que es algo que no se usa en C o casi no se usa.

1 Like

Hola maestros: MaximoEsfuerzo, IgnoranteAbsoluto y Surbyte

Muchas gracias por vuestra rápida y eficaz ayuda. !!!!

No volveré a poner goto en ningún código.
Lo había consultado en la pagina oficial de Arduino y no hace mención de esa carencia. :innocent:

Repito un saludo !!! ... :cocktail:.... :cocktail:... :cocktail:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.