Someone show me how to make line breaks unused "goto".

Hi, I'm learning to program autodidactically, I have a problem when making newline, I use "goto" to make that jump to a specific point, but I would like to learn to use another technique so as not to use "goto" and it is a bad practice, and I want it now I'm learning.

This is a part of the programming:

#include <Keypad.h>
#include <LiquidCrystal.h>

///////////////////////LCD///////////////////////////////////////

//Incializa la libreria con los numeros de pines a interactuar el LCD
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

///////////////////////////////////////////////////////////////////


//////////////Teclado/////////////////////////////////////////////

//Definición de filas y columnas
const byte Filas = 4; //Cuatro filas
const byte Cols = 4; //Cuatro columnas

//Definición de los pines
byte Pins_Filas[] = {3, 2, 1, 0}; //Pines Arduino para las filas
byte Pins_Cols[] =  {4, 5, 6, 7}; // Pines Arduino para las columnas


//Definición de las teclas
char Teclas [ Filas ][ Cols ] =
{
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

//Se crea una instancia llamada Teclado1 y el cual asignara las teclas que tenemos en el arreglo "Teclas" y le decimos
//que se han conectados los pines de las filas y columnas


Keypad kpd = Keypad(makeKeymap(Teclas), Pins_Filas, Pins_Cols, Filas, Cols);



char Teclado ()
{
  do{
    
    char Tecla = kpd.getKey();         // lee el teclado por si hay alguna tecla pulsada
    
    if(Tecla != NO_KEY)          
    {
      return Tecla;
    }   
  } while (1);
}

int i = 0;
static int cnt = 0;
char kp;
char Estado; 
char Menu;
char Ingresar_Contrasena[10];
char Contrasena1[] = {"123456"};
char Ingresar_Contrasena_Adm[10];
int short Peligro = A1;

void setup() {
 lcd.begin(16, 4); //Configura el LCD con el numero de columas y filas. Para un LCD 16x4: 16 columnas y 4 filas.
  lcd.display(); //Enciende el display
}

void loop() {
  // put your main code here, to run repeatedly:
borrar:                                                      //------------------------------------Goto borrar
lcd.clear();//Limpia Pantalla
lcd.setCursor(1,0);lcd.print("Administrador");     //Imprime en la LCD
lcd.setCursor(1,1);lcd.print("Ingresar Pass");     //Imprime en la LCD
                                   


for( i=0; i < sizeof(Ingresar_Contrasena); i++){ 

     kp = Teclado (); //Obtiene el valor de la tecla pulsada
     Ingresar_Contrasena[i]=kp;      
                                            
    if(Ingresar_Contrasena[i]=='#'){ 
              Ingresar_Contrasena[i] = '\0'; //Sustituir por el caracter nul    
              break; 
    }
                                        
     else{ //Si presiona * borra pantalla 
           if(Ingresar_Contrasena[i]=='*'){
                  goto borrar;                                             //------------------------------------Goto
           }
    }
                                        

     if(i == (sizeof(Ingresar_Contrasena)- 1)){
           i--;
     }

     lcd.setCursor(3+i,3); lcd.print('*'); 
 }

//Si en las teclas 5, 6, 7, 8, 9 presiono numeral compara si la contraseña es correcta o no, de ser correcta accede al menu, de lo contrario no.

if ((Ingresar_Contrasena[0] == '\0') || (Ingresar_Contrasena[1] == '\0') || (Ingresar_Contrasena[2] == '\0') || (Ingresar_Contrasena[3] == '\0') || (Ingresar_Contrasena[4] == '\0') || (Ingresar_Contrasena[5] == '\0') || (Ingresar_Contrasena[6] == '\0') || (Ingresar_Contrasena[7] == '\0') || (Ingresar_Contrasena[8] == '\0') || (Ingresar_Contrasena[9] == '\0')){
                                        

//Si estado es cero y las teclas pulsadas coinciden con la contraseña por default accede al menu
        if((cnt<3) && (strcmp (Contrasena1, Ingresar_Contrasena)==0) && (Estado == 0)){ 
                Menu=1;
        }
 
//Si estado es 1 y las teclas pulsadas coinciden con la contraseña guardada en la memoria eeprom     accede al menu

         else if ((cnt<3) && (strcmp (Ingresar_Contrasena_Adm, Ingresar_Contrasena)==0) && (Estado == 1)){
                    Menu=1;
         }

          //Si ninguna de las contraseña es correcta muestra el mensaje incorrecto
          else{ 
                cnt++;
                lcd.clear(); //Limpia pantalla
                lcd.setCursor(2,1);lcd.print("INCORRECTO");     
                delay(100);
                goto borrar;                                                 //------------------------------------Goto
                
           }
                                        
            //Si el usuario ingreso mal 3 veces la contraseña muestra el mensaje
             
            if(cnt==3){ 
                cnt=0; 
                lcd.clear(); //Limpia pantalla
                lcd.setCursor(4,2);lcd.print("PELIGRO");     //Imprime en la LCD
                digitalWrite(Peligro, HIGH);
                delay(1000);
                digitalWrite(Peligro, LOW); 
             }

             //---------------------------Menu del admnistrador-----------------------------
                                         
              if(Menu==1){
                    lcd.clear();  //Limpia pantalla
                    lcd.setCursor(1,0);lcd.print("1. Ingresar");      //Imprime en la LCD
                    lcd.setCursor(1,2);lcd.print("2. Usuarios");      //Imprime en la LCD
                    lcd.setCursor(1,3);lcd.print("3. Cambiar Pass");   //Imprime en la LCD
                    delay(100);

            }

  }


}

I use 2 gotos

First:

else{ //Si presiona * borra pantalla 
           if(Ingresar_Contrasena[i]=='*'){
                  goto borrar;                                             //------------------------------------Goto
           }
    }

Second:

else{ 
       cnt++;
       lcd.clear(); //Limpia pantalla
       lcd.setCursor(2,1);lcd.print("INCORRECTO");     
       delay(100);
       goto borrar;                                                 //------------------------------------Goto
                
           }

Both make that leap to "borrar"

borrar:                                                      //------------------------------------Goto borrar
lcd.clear();//Limpia Pantalla
lcd.setCursor(1,0);lcd.print("Administrador");     //Imprime en la LCD
lcd.setCursor(1,1);lcd.print("Ingresar Pass");     //Imprime en la LCD

Thank you very much for your help.

(translated by: translate google)

Delta_G:
If you just want to go back to the beginning of loop use return.

Not exactly the start of the loop, since I need to do other functions in my main program at the beginning of the loop.

I think I'll leave it with "goto"

Thank you very much.

carloszuniga:
Not exactly the start of the loop, since I need to do other functions in my main program at the beginning of the loop.

I think I'll leave it with "goto"

Thank you very much.

You are giving up too easy.
In your current code 'borrar' is at top of loop. I can see in your code you have a 4x4 keypad. You read keypresses and then do things according to what was pressed. Probably there is no need to use goto to get back to top. If you found a if statement that is true, most likely the remaining is false and there is no need to use goto to get back to top.
You can also divide code into functions so you don't have all your code in loop.

Don't use GOTO for anything. Organize your code into functions and then you can call a function whenever required. Have a look at Planning and Implementing a Program

...R

In this way? (I enclose a note pad programming)

I thought it would not work, but I was fine

When the user makes a mistake when entering password and need to delete

void Ingresar_Contrasena_Admnistrador(){
  lcd.clear();//Limpia Pantalla
  lcd.setCursor(1,0);lcd.print("Administrador");     //Imprime en la LCD
  lcd.setCursor(1,1);lcd.print("Ingresar Pass");     //Imprime en la LCD

   //------------Funcion para ingresar la contraseña administrador---------------------
   for( i=0; i < sizeof(Ingresar_Contrasena); i++){ //Sizeof obtiene el tamaño del arreglo Ingresar_Contraseña, con el fin de obtener un valor exacto y facilite al programador si decea cambiar el tamaño del arreglo, no cambiarlo el tamaño en todos las funciones que se utilizaron con dicho arreglo.

            kp = Teclado (); //Obtiene el valor de la tecla pulsada
            Ingresar_Contrasena[i]=kp; //Guardar la tecla pulsada en la Matriz      
            
            if(Ingresar_Contrasena[i]=='#'){ //Si presiona # ejecuta la siguiente funcion 
                Ingresar_Contrasena[i] = '\0'; //Sustituir por el caracter nul    
                break; //Se sale del ciclo y ejecuta la funcion de ingresar contraseña de confirmacion
             }
        
             else{ //Si presiona * borra pantalla 
                if(Ingresar_Contrasena[i]=='*'){
                  Admnistrador ();
                 }
             }
        
             //Si el usuario sigue presionando mas botones de lo que permite el arreglo contrasena_ingresada almacenar, detiene y evita que siga tecleando.
             //ayuda a no solo detener el ciclo para evitar que siga tecleando, tambien ponerle un limite y evitar que se salga del programa.
            if(i == (sizeof(Ingresar_Contrasena)- 1)){
              i--;
            }

      lcd.setCursor(3+i,3); lcd.print('*'); //Imprime en la lcd
   }
}

use the function Admnistrador ();

also to show the wrong message

else{ 
    cnt++;                                
    lcd.clear(); //Limpia pantalla
    lcd.setCursor(2,1);lcd.print("INCORRECTO");     //Imprime en la LCD
    delay(100);
    lcd.clear(); //Limpia pantalla
    Admnistrador ();
}

I present only problem it is that when the user enters the wrong password 3 times not run the "danger"

if(cnt==3){ 
           cnt=0; 
           lcd.clear(); //Limpia pantalla
           lcd.setCursor(4,2);lcd.print("PELIGRO");     //Imprime en la LCD
           digitalWrite(Peligro, HIGH);
           delay(1000);
           digitalWrite(Peligro, LOW); 
         }

In my previous program if it works, but it used "goto"

Help

Thank you

(translate by google)

Arduino ayuda.txt (10.3 KB)

Without seeing the complete program it is hard to give any useful advice.

My wild guess is that you should not be calling the Admnistrador() function from inside the Ingresar_Contrasena_Admnistrador() function. Rather you should let the first function complete and then call the other function. That may require some redesign of the structure of the program.

However, as well as not seeing the whole program I cannot understand your function names.

Maybe you would find it more helpful to ask your question in the Forum section dedicated to your language.

...R

void Admnistrador (){
...
            Admnistrador ();

Your function Admnistrador calls itself. This is not going to end well.

:slight_smile:

...R