Lib PASSWORD - Problème avec 2 pass simultanés

Hello , je suis sur un projet où je veux disposer de deux mot de passe différents.

J'utilise la libraire PASSWORD et j'ai crée quelques fonctions pour changer un mot de passe ou bloquer un while en demandant un mot de passe.

ma fonction prend donc le mot de passe en argument ex:

void maFonction(Password &myPass){

bla bla bla 
}

avant d'exposer plus de code (il est long !) j'ai un doute sur le & pour recup la valeur de Password (l'argument sera alors maFonction(password1) ou maFonction(password2) car lorsque je veux modifier les deux codes ; le premier code est effacé avec la valeur du dernier code entré ...

le & a t'il sa place ici ?

merci d'avance ...

Bonjour,

Le & indique un passage par référence (par adresse) du paramètre.
Ca veut dire que la fonction travaille directement sur la variable qui lui est passé et si la fonction la modifie, la variable qui lui est passée sera modifiée.

oui c'est bien cela que je fais mais le fait que la référence soit de type "Password" cela ne change pas la donne ?

Password étant un char array d'après ce que j'ai vu dans le header, un array ne fonctionne pas comme un pointeur à la base ?

Pour les arrays, le passage par référence est le défaut.

Donc pour ce cas précis mon & ne sert a rien ?

Si, il faut le &, parce que Password n'est pas un char array mais une class.

On peut passer un paramètre à une fonction par valeur.

void une_fonction ( Password p ) {  ... }
...
PassWord pw = ...;
une_fonction ( p );

il y a copie de ce qui est passé en argument (effets de bord possibles). La fonction peut utiliser la valeur passée, mais pas la modifier (vu de l'appelant).
Pour éviter la copie, on peut faire un passage par référence :

void une_fonction ( Password & p ) {  ... }
...
PassWord pw = ...;
une_fonction ( p );

Dans ce cas, la fonction peut utiliser la valeur de p, mais aussi la modifier (vu de l'appelant).
C'est ennuyeux quand c'est une fonction qu'on n'a pas écrit soi-même (tirée d'une bibliothèque, par ex.)
car on ne sait pas si la fonction va ou pas modifier ce qu'on lui passe.
Pour éviter cette angoisse, le C++ demande à déclarer ainsi une fonction qui s'engage sur la tête de sa mère à ne pas modifier le paramètre passé :

void une_fonction ( const Password & p );  // NOTER le const

C'est une forme de politesse programmatique.

Merci Biggil pour cette info , je vais tester cette voie demain... j'y ai passé la journée a essayer de debug ça ... grr !

si j'utilise uniquement les fonctions de la lib , ça marche coorectement ...

Quand je passe par des références cá me fait du n'importe quoi si je viens a modifier l'un ou l'autre ...

sachant que dans ma fonction je ne fait rien de fou a par stocker les key (.getKey()) dans des char array[lenghtPass] ...

quand je veux remettre ce array au null , je passe dans un for:

for(byte i = 0; i < lenghtPass ; i++){
array[i] = NULL;
}
lenghPass = 0;

j'ai pu tester le résultat via le Serial.print je pense ne pas me tromper et c'est la seule variable temporaire qu'il y a en commun (mis a part la fonction bien sur)

du coup , ce "const" est a placer uniquement là ou le Password doit être comparé et non là ou je dois le modifier via le myPass.set("newPassword") ???

EDIT: testé avec const ... tjr le même soucis, je pense que je vais partir sur l'option de tout coder moi même pour la gestion du mot de passe comme ça je pourrais mieux maîtriser les coulisses ^^

Pourquoi stocker le mot de passe dans un array alors qu'il est déjà stocké dans l'instance de la class Password?

Car la méthode donnée dans l'example n'etais pas facile a gerer pour moi , donc j'ai contourné comme cela pour pouvoir décider quel mot de passe cibler et quand .

l'exemple de la méthode de base:

void setup(){

  Serial.begin(9600);
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}

void loop(){
  keypad.getKey();
}

//take care of some special events
void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
    case PRESSED:
	Serial.print("Pressed: ");
	Serial.println(eKey);
	switch (eKey){
	  case '*': checkPassword(); break;
	  case '#': password.reset(); break;
	  default: password.append(eKey);
     }
  }
}

le keypad.addEventListener surveille constamment les entrées keypad donc pour mes 2 mdp c'est problématique

Si tu veux gérer deux password avec la librairie Password, il te faut créer deux instances de Password:

Password password1("1234");
Password password2("4567");

Bien entendu c'est fait déjà :wink:

Salut,

dans ce cas il ne reste qu ' a passer le bon password 1 ou 2 en argument a votre fonction .

il doit y avoir une confusion quelquepart , et vous ne detaillez pas suffisament votre probleme .

donnez un exemple ( quand ca ne vas pas ) et dites nous quel comportement est attendu le plus precisement possible .

Limp47:
Merci Biggil pour cette info , je vais tester cette voie demain... j'y ai passé la journée a essayer de debug ça ... grr !

si j'utilise uniquement les fonctions de la lib , ça marche coorectement ...

Quand je passe par des références cá me fait du n'importe quoi si je viens a modifier l'un ou l'autre ...

sachant que dans ma fonction je ne fait rien de fou a par stocker les key (.getKey()) dans des char array[lenghtPass] ...

quand je veux remettre ce array au null , je passe dans un for:

for(byte i = 0; i < lenghtPass ; i++){

array[i] = NULL;
}
lenghPass = 0;




j'ai pu tester le résultat via le Serial.print je pense ne pas me tromper et c'est la seule variable temporaire qu'il y a en commun (mis a part la fonction bien sur)

du coup , ce "const" est a placer uniquement là ou le Password doit être comparé et non là ou je dois le modifier via le myPass.set("newPassword") ???

EDIT: testé avec const ... tjr le même soucis, je pense que je vais partir sur l'option de tout coder moi même pour la gestion du mot de passe comme ça je pourrais mieux maîtriser les coulisses ^^

lenghtpass ne comporte il pas un caracter suplementaire en fin de chaine ?

essayer de faire password = 1234; puis den voyer sur le moniteur serie le nombre de caracteres du mot de passe , 0.1.2.3 ou 0.1.2.3.4 ???