les tableaux

bonjour a tous

Tout d'abord joyeuse Pâques a toute la communauté !!!!!
J ai une question (comme toujours :smiley: ).
Je voulais savoir si l on pouvait dans le même programme comparer deux tableaux, c'est a dire je défini un tableau avec des valeurs constante prédéfinies genre un code a 4 chiffres et si le deuxième tableaux est remplie avec les même valeur que le premier j allume une LED ou autre.
Biensur si c est possible pourriez vous me donne la syntaxe de ce procédé ou une piste un tuto par exemple.
Merci d'avance et bonne soirée a tous!!!! ;D

deja d’une pour parcourir un tableau, il faut quoi… une boucle…
Pour parcourir deux tableaux… une deuxieme boucle imbriqué…

 for (i=0; i < 10; i++)
    {
        for (j=0; j < 10; j++)
        {
            if (tab1[i] == tab2[j])
            {
          // tu fais ton truc...
            }
           else {
           //tu fais autre chose...
          }
        }
    }

Avec un minimum de recherche sur google ( comparer 2 tableaux en C/C++) tu trouves des tonnes d’exemples…

Tout dépend de ce que tu entends par egalité

Si le tableau 1 contient les valeurs 3, 9, 5, 11 et le tableau 2 contient les valeurs 3, 9, 5, 11
On peut considérer qu'ils sont égaux

Mais d'après ta question
si le tableau 1 contient les valeurs 3, 9, 5, 11 et le tableau 2 contient les valeurs 3, 11, 5, 9
faut-il les considérer égaux ?

tout a fait, mais de ce faite, il dans ce cas trier le tableau dans un ordre ( croissant ou décroissant)

Mais comme on as pas d'exemple concret, c'est un peu plus compliqué

par exemple si c'est pour déterminer un mot de passe a 4 chiffres (4,6,7,2)

il ne faut pas trier, mais comparer....

merci pour vos retour rapide c est genial !!!!!

effectivement c est dans le cas d un code , mot de passe comme un digicode par exemple.

le but est qu il y est un clavier de 0 à 9 , je défini un code mot de passe dans le premier tableau par exemple 4321 et l utilisateur doit rentrer le bon code qui s inscrira dans un deuxième tableau et les deux seront comparé pour actionner un relais ou autre.
je précise que je n'ai jamais utilisé de tableau, c'est pour cela que je pose surment des questions plutôt idiote je m en excuse.

l avantage des tableaux si j ai bien compris , c'est que je puisse changer le mot de passe par exemple pendant le setup si a l allumage de la carte je reste appuyé sur une touche je rentre en programmation d un nouveau mot de passe qui s inscrirait dans le premier tableau puis une fois fait, il faut la redémarrer sans appuyer biensur et le code resterai inscrit dans la mémoire de l arduino.
il n y aura plus qu a taper le bon mot de passe pour activer un relais ou LED.

en gros je cherche a reproduire le fonctionnement d un clavier de système d alarme ou un digicode.

voila tout j espère avoir été plus clair je continu mes recherches sur le net en parallèle.

merci a tous :sweat_smile:

#define NB_ELEMENT 4
unsigned char nb_egaux=0;
int tableau1[NB_ELEMENT], tableau2[NB_ELEMENT]:


for (unsigned char i=0; i < NB_ELEMENT; i++)
   {
   if(tableau1[i]==tableau2[i]) nb_egaux++;
   }
if(nb_egaux==NB_ELEMENT) {
   // tableaux egaux
   }

voici un code plus efficace (pas besoin de comparer tous les éléments si on détecte une différence) :

bool ok = true;
for ( int i=0; i < NB_ELEMENTS; i++ )
{
  if ( tableau1[i] != tableau2[i] ) 
  {
     ok = false;
     break;
  }
}

if ( ok ) {
  // tableaux egaux
}

merci des tuyaux je m y mets !!!!!

juste une petite question encore quelle est la fonction du "break" je croyais qu on ne pouvait que l utiliser dans un "switch case"???

acedar:
juste une petite question encore quelle est la fonction du "break" je croyais qu on ne pouvait que l utiliser dans un "switch case"???

break permet aussi de sortir d'une boucle en cours de route

Sinon pour comparer 2 tableaux de taille connue, vous avez la fonction [url=http://www.cplusplus.com/reference/cstring/memcmp/]memcmp()[/url] qui est en standard. Voici un petit exemple d'utilisation

const char motDePasse[] = {'1', '2', '3', '4'};

char code1[] = {'A', 'B', 'C', 'D'};
char code2[] = {'1', '2', '3', '4'};


void setup() {
  Serial.begin(115200);

  if (memcmp(motDePasse, code1, sizeof(motDePasse)) == 0) { // http://www.cplusplus.com/reference/cstring/memcmp/
    Serial.println(F("code1 est correct"));
  }

  if (memcmp(motDePasse, code2, sizeof(motDePasse)) == 0) { // http://www.cplusplus.com/reference/cstring/memcmp/
    Serial.println(F("code2 est correct"));
  }
}

void loop() {}

La comparaison avec cette fonction se fait octet par octet, donc va fonctionner avec tout type de données, il suffit de dire combien d'octets on veut comparer. (on compare bien des tableaux, pas des cstrings)

et si vous avez un keypad ou utilisez le port série pour entrer votre code, mon petit tuto Ecouter le Port Série ou un keypad pourrait vous être utile

merci mille fois avec tout ces details et renseignements je vais pouvoir avancer :smiley:

bonsoir,

après plusieurs heure d essais ainsi que des heures de forum et tuto, j ai pas avancé d un micron.
il doit y avoir d innombrable erreur dans ce code mais je suis un arduiniste amateur et ultra noob.
je vous joint mon pseudo code et si quelqu un pouvait me dire si j inscrits bien le valeur voulues dans mon second tableau.
je ne maitrise pas vraiment les tableaux mais il est possible que mon erreur soit ailleurs que dans les tableaux voila donc ce code qui me rend fou >:(

int tailleTableau=4;


char motDePasse [4]={1,2,3,4};

char motDePasseTaper[]={};

int indexTableau = 0;

const int bouton1 = 2;
const int bouton2 = 3;
const int bouton3 = 4;
const int bouton4 = 5;

int etatBouton = LOW;


static char valeurBouton1 = 1;
static char valeurBouton2 = 2;
static char valeurBouton3 = 3;
static char valeurBouton4 = 4;




void setup(){
  
  Serial.begin(9600);
  
  pinMode ( bouton1,INPUT);
  pinMode ( bouton2,INPUT);
  pinMode ( bouton3,INPUT);
  pinMode ( bouton4,INPUT);
  
 
}
  
  void loop(){
    
valeurBouton1 == bouton1;
valeurBouton2 == bouton2;
valeurBouton3 == bouton3;
valeurBouton4 == bouton4;
   
    
     
    if (digitalRead (bouton1) == HIGH || digitalRead (bouton2) ==HIGH || digitalRead(bouton3)==HIGH || digitalRead(bouton4)==HIGH){
      if (bouton1,bouton2,bouton3,bouton4 != etatBouton);{
        
        delay(100);
        
       indexTableau ++;
        motDePasseTaper[indexTableau];
        Serial.println (indexTableau);
      }
        if(motDePasseTaper[4]== motDePasse[4]){
        Serial.println("code bon"); 
        
      }
      if(indexTableau>=4){
        
        indexTableau = 0;}
    
    }
   
    
  }

j ai bien conscience que ce morceau de code doit vous donner mal a la tête et qu il est bourré d erreur sauf que je suis incapable de les trouver.
merci pour vos précieuse remarques et conseils

Sérieusement - dans méchanceté aucune - il faut vous pencher sur un cours de C - laissez tomber les projets compliqués pour le moment - apprenez la base de la programmation et vous pourrez ensuite revenir à votre projet

En effet, sans être un cador de la programmation en C, je pense qu'il y a pas mal d'erreurs dans ces quelques lignes :

      if (bouton1,bouton2,bouton3,bouton4 != etatBouton);{
        
        delay(100);
        
       indexTableau ++;
        motDePasseTaper[indexTableau];

Le if avec des virgules : ça doit être un raccourci un peu rapide. C'est pour tester si les 4 variables sont toutes différentes de etatBouton ? Si oui, il vaut mieux utiliser le &&
Je ne suis pas sûr que le ++ s'emploie comme ça : il faudrait plutôt écrire

indexTableau +=1;

Enfin la dernière ligne n'est pas terminée : si c'est une affectation, il faut dire à quelle valeur elle est affectée.

Il y en a malheureusement d’ autres qui sont des trucs de base

char motDePasseTaper={};
...
aleurBouton1 == bouton1;
valeurBouton2 == bouton2;
valeurBouton3 == bouton3;
valeurBouton4 == bouton4;
....

effectivement c est ce que je pensais c est un projet trop complexe pour mes maigre connaissances et mon manque de pratique j y reviendrai plus tard .

en attendant merci quand même.

#include <Keypad.h>

int i=0;
char motdepassetaper[]={'0','0','0','0'};
char motdepasse [] ={'4','3','2','1'};

const byte ROWS = 2; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','4'},
  {'5','6','7','8'},
  
  
};
byte rowPins[ROWS] = {7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); 

void setup(){
  Serial.begin(9600);
  
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
    motdepassetaper[i]=customKey; // j inscris la touche appuyée dans une case du tableau
    i++;// j incremente i pour me deplacer de case dans le tableau
    
  }
    if ( i == 4){//quand il y a eu 4 appui, je compare mes deux tableaux
      if (memcmp(motdepasse, motdepassetaper, sizeof(motdepasse)) == 0){// si mes deux tableau sont identique
        Serial.println("code bon");// j'ecris code bon
       
      }
      else{Serial.println ("mauvais code");}//sinon j ecris mauvais code
    }
  
}

bonjour,

après des maux de tête pas croyable et des heures d errance sur des tuto des forum et biensur avec tout les info que vous m’avez fourni et une persévérance qui a failli détruire mon couple , j’ai enfin un début de code fonctionnel qui fait ce que je veux.
vous allez me dire c’est pas grand chose mais pour moi c’est comme aller sur la lune en vélo.
en fait mon souci était que je comprenais pas pourquoi le programme écrivait toujours “mauvais code”.
il y avait plusieurs erreurs:

premiere: char motdepasse ={‘4’,‘3’,‘2’,‘1’}; je n avais pas mis les ’

deuxieme: motdepassetaper*=customKey;*

  • i++;*
  • j’avais inverser les deux lignes*
    un grand merci a J-M-L pour son coup de pousse et son coup de pied au cul :smiley: :smiley: :smiley: :smiley:

Bravo!

vous pourriez tester si le code est complet uniquement quand vous avez reçu un nouveau caractère et pas en permanence dans la boucle (en mettant de test au sein du premier If). Sinon vous ne remettez jamais i à zéro donc votre code ne fonctionne qu’une fois

effectivement il ne fonctionne qu une fois
j’ai juste rajouté i=0 après mon teste de tableau et aussi dans mon else

" if ( i == 4){
if (memcmp(motdepasse, motdepassetaper, sizeof(motdepasse)) == 0){
Serial.println(“code bon”);
delay(100);
i=0;
}

else{Serial.println (“mauvais code”);}
delay(100);
i=0;
"
et ça fonctionne a merveille

merci encore

une dernière question pour ma culture générale.

pourquoi y a t il un ==0 dans la fameuse ligne?a quoi correspond il? a quoi sert il ?

"(memcmp(motdepasse, motdepassetaper, sizeof(motdepasse))==0)"

peut être ne devrais je pas poser cette question lol.

Suffit de lire la doc de la fonction [

memcmp()

](Page manuel de MEMCMP)