Comparación de arreglos bidimensional y unidimensional.

Hola, estoy haciendo un sistema de seguridad en donde el usuario ingresa un ID (en mi caso de 2 digitos) y una contraseña (5 digitos).

El ID tiene que ser unico para cada usuario, cuando un usuario ingresa un ID existente muestra el mensaje “Usuario Existente” y cuando ingresa un ID nuevo procede a guardar el ID en un espacio vació de la matriz bidimensional y luego guarda la contraseña.

El problema se presenta cuando el usuario ingresa un ID (Ya sea existente o no):

Cuando el ID no existe muestra el mensaje “Usuario no existente” y se supone que después debería de guardar esa ID en la matriz pero no la guarda, ya que al ingresar otra vez la misma ID regresa a la misma condición de usuario no existente.

Cuando el ID existe el programa se queda congelado y no pasa a la siguiente condicion “Usuario Existente”.

Aqui el programa:

char  contrasena_ingresada [6];
char contrasena_guardada[1][2];

void setup() {
  
}


void loop() {

int estado;

lcd.clear();
lcd.setCursor(0,0); lcd.print("ingrese ID"); //Imprime en la lcd      
char kp=Teclado (); //Obtiene el valor de la tecla que fue pulsada.

 for(int i=0; i<=2; i++){
    kp = Teclado (); //Obtiene el valor de la tecla pulsada
    contrasena_ingresada[i]=kp; //Guardar la tecla pulsada en la Matriz "Tecla pulsada"
    lcd.setCursor(5+i,3); lcd.print(contrasena_ingresada[i]); //Imprime en la lcd                           
}

if (contrasena_ingresada[2] == '#'){

for(int i=0; i<10;){ //Filas 
  for(int j=0; j<2; j++){ //Columnas 
  if(contrasena_guardada[i][j] == contrasena_ingresada [j]){ //Compara cada una de las colmunas hasta llegar a la columna 5, si son iguales muestra el mensaje "CORRECTO"

      if(j==1){ //Hasta que llegue al ultimo valor muestra el mensaje "Usuario existente" //------- Esta condicion es el con el fin de no ejecutar la siguiente intruccion cada vez que contrasena_guardada e contrasena_ingresada sean iguales
        estado = 1;
        break;      
      }
    }


  else{ // De no ser iguales algunas de las columnas de contrasena_guardada e contrasena_ingresada incrementa la siguiente fila para proceder a la siguiente comparacion
     i++;
     
     if(i == 10){ //Si al llegar a la ultima fila no coinciden ningunas de las contraseña muestra el mensaje "Usuario no existente" //------- Esta condicion es el con el fin de que una vez que haya realizada la busqueda en la matriz contrasena_guardada y ninguna coincida ejecute la siguiente instruccion
      estado = 2;
     }
    }

  }
}


switch (estado){
  
  case 1:
  lcd.clear (); lcd.setCursor(0,0); lcd.print("Usuario existente); delay(100);
  estado = 0;
  break;


  case 2:
  lcd.clear (); lcd.setCursor(0,0); lcd.print("Usuario no existente"); delay(100);
  
   for(int i=0; i<10;){ //filas
    for(int j=0; j<=1; j++){ //Columnas
      if(contrasena_guardada[i][j]==0x00){ //Si esa posicion se encuentra vacio procede a guardar
        contrasena_guardada[i][j] = contrasena_ingresada [j];
        break;
    }

    else{ //Si no incrementa las filas hasta buscar una direccion que se encuentre vacia
       i++;
    }
  }
  }
  estado = 0;
  break;
}

}

En la condicion:

if(contrasena_guardada[i][j] == contrasena_ingresada [j]){ 

      if(j==1){ 
        estado = 1;
        break;      
      }

if(j==1) lo tuve que poner debido a que si yo de manera manual ponía en la matriz bidimensional

char contrasena_guardada[1][2] == {‘0’, ‘1’} (esto solo para comprobar si funciona la programacion)

y al momento de teclear (‘0’, ‘2’) (‘0’, ‘3’) (‘0’, ‘4’) etc… siempre muestra el mensaje

“Usuario existente”, en cambio si presiono (‘0’, ‘1’) el programa se queda pegado.

Al poner if(j==1) aseguro que si se compara todas las teclas con la matriz bidimensional ponga

estado = 1 y pase a la siguiente condicion.

Espero que alguien le entienda y me ayude ya que estoy aprendiendo a programar y tengo que presentar el proyecto en clases.

¡Muchas gracias de antemano!

¡Saludos!

Hi, I'm doing a security system where the user enters an ID (in my case 2 digits) and password (5 digits).

The ID must be unique for each user, when a user enters an existing ID displays the message "Existing User" and when you enter a new ID comes to save the ID in a space emptied of the two-dimensional array and then stores the password.

The problem occurs when the user enters an ID (either existing or not):

When the ID does not exist display the message "non-existent user" and it is assumed that after should save that ID in the matrix but not saved, because when entering again the same ID again returns to the same status non-existent user..

When the ID exists the program remains frozen and does not pass to the next condition "Existing User".

Hello,

The first noticeable thing is this:

char contrasena_guardada[1][2];

And later, this:

for(int i=0; i<10;){ //Filas 
  for(int j=0; j<2; j++){ //Columnas 
  if(contrasena_guardada[i][j] == contrasena_ingresada [j]){ //Compara cada una de las colmunas hasta llegar a la columna 5, si son iguales muestra el mensaje "CORRECTO"
...
   for(int i=0; i<10;){ //filas
    for(int j=0; j<=1; j++){ //Columnas
      if(contrasena_guardada[i][j]==0x00){ //Si esa posicion se encuentra vacio procede a guardar

Your variable is not big enough, so it will read beyond the array, and the result will be invalid data, because this memory place may be used by another variable or whatever.

To avoid this kind of errors, declare another constant variable that holds the size of the array’s dimension.

const uint8_t numOfSomething = 10;
...
char contrasena_guardada[numOfSomething][2];
...
for(int i=0; i<numOfSomething;i++){

If you can translate code and comments in english, you will have more help.

Bienvenido al foro de Arduino en Español. Alguien del foro en inglés te informó y aquí te traje. Saludos!

Code updated:

char  contrasena_ingresada [3]; //password entered
char contrasena_guardada[10][2]; //password saved

void loop() {
int estado;

lcd.clear();
lcd.setCursor(0,0); lcd.print("enter ID"); //Prints on the LCD "enter id"     


for(int i=0; i<=2; i++){
   char kp=Teclado (); //gets the value of the key pressed
   contrasena_ingresada[i]=kp; //Save the key pressed in the arrangement "password entered"
   lcd.setCursor(5+i,3); lcd.print(contrasena_ingresada[i]); //Print button on the LCD                          
}

if (contrasena_ingresada[2] == '#'){ //if the last key pressed is #
 
for(int i=0; i<11; i++){ //Filas 
 for(int j=0; j<2; j++){ //Columnas
 if(contrasena_guardada[i][j] == contrasena_ingresada [j]){ //Compare each of the columns to reach the last 5, if they are equal: status = 1;
   
     if(j==1){ // Until they reach the last value shows the "existing user" message // ------- This condition is in order not to execute the next Instruction whenever contrasena_guardada and contrasena_ingresada are equal
       estado = 1; // When state = 1 displays the message "Existing User"
       break;      
     }
   }


 else{ 
    
    if(i == 10){ //if "i" reaches 10 displays user does not exist" //------- This condition is the so that once you have performed the search in the arrangement contrasena_guardada and none match run the following command
     estado = 2; //print "user does not exist" and then save
    }
   }
 }
}
}

switch (estado){
 case 1:
     lcd.clear ();
     lcd.setCursor(0,0); lcd.print("existing"); 
     lcd.setCursor(0,1); lcd.print("user");
     delay(300);
     estado = 0;
 break;


 case 2:
     lcd.clear ();
     lcd.setCursor(0,0); lcd.print("user does");
     lcd.setCursor(0,1); lcd.print("not exist");
     
     for(int i=0; i<11; i++){
       for(int j=0; j<2; j++){ //Columnas
         if(contrasena_guardada[i][j]==0x00){ // looking for an empty space in the array
           contrasena_guardada[i][j] = contrasena_ingresada [j]; //save
             break;
          }
       }
     }
     delay(300);
     estado = 0;
break;
}

lcd.clear (); lcd.setCursor(0,0); lcd.print("END"); delay(100);

}

if(j==1) I had to put to prevent executed:

Case 1:

contrasena_ingresada [] = { '0', '1'}
contrasena_guardada [0] [1] = { '0', '1'}

if "contrasena_guardada [0] [0] == contrasena_ingresada [0]" then "state = 1"
if "contrasena_guardada [0] [1] == contrasena_ingresada [1]" then "state = 1"

Case 2:

contrasena_ingresada [] = { '0', '1', 2 ',' A '}
contrasena_guardada [0] [1] = { '0', '1', '2', '3'}

if "contrasena_guardada [0] [0] == contrasena_ingresada [0]" then "state = 1"
if "contrasena_guardada [0] [1] == contrasena_ingresada [1]" then "state = 1"
if "contrasena_guardada [0] [2] == contrasena_ingresada [2]" then "state = 1"
if "contrasena_guardada [0] [3] != contrasena_ingresada [3] diferent

if “contrasena_guardada [0] [3] != contrasena_ingresada [3]” It’s not the same but the program previously run “status = 1” so I decided to fix it by putting:

For Case 1: if (j == 1)
For case 2: if (j == 3)

By putting if (y == 1) I assure you that if all keys compared to the two-dimensional array set “status = 1” and go to the next condition.

Thanks for taking the time to help me

I did with whole numbers and comparing only one column, for example:

for(i=0; i<10; i++){
   if(contrasena_guardada [i] [0] == numero entero){
   estado = 1;
    }
   
    else{
       if(i==9){
          estado = 2;
       }
   } 
}

switch(estado){

case 1:
        lcd_print(existing user);
        estado=0;
break;

case 2:
      lcd_print(on-existent user);
      estado=0;
break;
}

and I worked well but only use 1 column now I have to use 2 or more columns, that depends.

Carlos! Me parece a mi o nos estás tomando el pelo a todos? En el foro en inglés escribiste en castellano y en el foro en castellano escribes en inglés?