Serrure Badge NFC - ajout et retrait d'utilisateurs ayant accès

c'est dans le code source :slight_smile:

on peut appeler equals() mais aussi utiliser == si on veut (ou !=). Mais il faut bien sûr une String ou c-string de l'autre côté de l'opérateur...

clairement ce type d'écriture n'est pas bon

int CarteAdminADD = "EB 3F B7 FF";

et si les warning sont activés, il y aurait un beau message à prendre en compte

warning: invalid conversion from 'const char*' to 'int' [-fpermissive]
 int CarteAdminADD = "EB 3F B7 FF";
                     ^~~~~~~~~~~~~

Mais, car il y a un mais... si vous testez ce code sur UNO

int carte1 = "EB 3F B7 FF";
String carte2 = "EB 3F B7 FF";

void setup() {
  Serial.begin(115200); Serial.println();
  if (carte2 == carte1) {
    Serial.println("c'est la même");
  } else {
    Serial.println("c'est pas la même");
  }
}

void loop() {}

et que vous ignorez le warning, vous verrez que cela fonctionne (enfin disons que ça tombe en marche par un heureux hasard de circonstances et que ce n'est pas ce qu'il faut faire).

La raison est que sur un AVR la compilation est assez laxiste (ça ne passerait pas sur un 32 bits) et les chaînes de texte sont mises en RAM et pas en Flash si on n'utilise pas PROGMEM. D'autre part c'est une architecture 8 bits et les int sont sur 16 bits, tout comme les adresses mémoire (les pointeurs).

Quand vous faites int carte1 = "EB 3F B7 FF"; vous affectez à carte1 en fait la valeur du pointeur en RAM vers la chaîne constante "EB 3F B7 FF". (un buffer de 12 octets terminé par un caractère nul). Vous pouvez voir cette adresse avec

  Serial.print("Adresse Carte1 : 0x");Serial.println(carte1, HEX);

et quand vous dites

  if (carte2 == carte1) {

les règles du C++ rentrent en jeu.
Comme on l'a vu dans le code source, == sait traiter deux types de paramètres pour une String. Soit on lui donne une String, soit un pointeur vers un c-string. Comme carte1 n'est pas une String, et que le compilateur sait faire la promotion d'un entier 16 bits vers un pointeur mémoire (j'ai dit qu'il était laxiste), l'opérateur retenu est la comparaison avec une c-string et la valeur contenue dans carte1 est interprétée comme un pointeur (ce qu'il était en réalité). La comparaison s'effectue donc bien entre les 2 textes et ça fonctionne...

Mais c'est quand même un joli concours de circonstances....

le code correct serait

const char* carte1 = "EB 3F B7 FF";
String carte2 = "EB 3F B7 FF";

void setup() {
  Serial.begin(115200); Serial.println();
  if (carte2 == carte1) {
    Serial.println("c'est la même");
  } else {
    Serial.println("c'est pas la même");
  }
}

void loop() {}
1 Like