Comparaison pointer/string

Yep!

Dans mon programme, je complète un tableau dans lequel est positionné des valeurs provenant de la liaison série.

char* TRAME[6];

et la fonction qui complète mon tableau :

void filldata(char *buffer) {
  char *p = buffer;
  char *str;
  int i = 0;
  while ((str = strtok_r(p, ";", &p)) != NULL) { // delimiter is the semicolon
    char *q = str;
    TRAME[i] = q;
    i++;
    //Serial.println(str);
  }
}

Ces valeurs sont donc relatives à des pointers.

J'aimerais comparer ces réferences à d'autres variables/valeurs afin d'effectuer des actions.

La trame pourrait ressembler à ceci à peu de chose prés : {RELAIS, 1, 1} = On active le relais 1. {Action, num, state}

Que j'écris ainsi, dans mes differents essais :

void checkdata() {
  if (TRAME[0][0] == 'S') { 
    Serial.println("Single action");
    if ((TRAME[1][0] == '1') && (TRAME[2][0] == '0')) { delay(25); rs485TxMsg("\xFF\x01\x00"); state_r1 = 0;}
    if ((TRAME[1][0] == '1') && (TRAME[2][0] == '1')) { delay(25); rs485TxMsg("\xFF\x01\x01"); state_r1 = 1;}
    if ((TRAME[1][0] == '2') && (TRAME[2][0] == '0')) { delay(25); rs485TxMsg("\xFF\x02\x00"); state_r2 = 0;}
    if ((TRAME[1][0] == '2') && (TRAME[2][0] == '1')) { delay(25); rs485TxMsg("\xFF\x02\x01"); state_r2 = 1;}
    else { }     
    }
  if (TRAME[0][0] == 'M') {
    Serial.println("Multiple action");
    if (TRAME[1][0] == '0') { delay(25); rs485TxMsg("\xFF\x01\x00"); state_r1 = 0;}
    if (TRAME[1][0] == '1') { delay(25); rs485TxMsg("\xFF\x01\x01"); state_r1 = 1;}
    if (TRAME[2][0] == '0') { delay(25); rs485TxMsg("\xFF\x02\x00"); state_r2 = 0;}
    if (TRAME[2][0] == '1') { delay(25); rs485TxMsg("\xFF\x02\x01"); state_r2 = 1;}
    else { }
    }
  if (TRAME[0][0] == 'T') { 
    Serial.println("Testing action"); 
    if ((string2float(TRAME[1]) >= 15.0) && (string2float(TRAME[1]) <= 16.5)) {
      delay(25); rs485TxMsg("\xFF\x01\x01"); state_r1 = 1;}
    else { }
    }
  if (TRAME[0][0] == 'I') { 
    Serial.println("Init action");
    rs485TxMsg("\xFF\x01\x00");
    delay(50);
    rs485TxMsg("\xFF\x02\x00");
    delay(50);
    state_r1 = 0;
    state_r2 = 0;
    }
  if (strcmp(TRAME[0], "RELAIS") == 0) {
    Serial.println("relais action");
    if ((strcmp(TRAME[1], "1") == 0) && (strcmp(TRAME[2], "0") == 0)) { delay(25); rs485TxMsg("\xFF\x01\x00"); state_r1 = 0;}
    if ((strcmp(TRAME[1], "1") == 0) && (strcmp(TRAME[2], "1") == 0)) { delay(25); rs485TxMsg("\xFF\x01\x01"); state_r1 = 1;}
    if ((strcmp(TRAME[1], "2") == 0) && (strcmp(TRAME[2], "0") == 0)) { delay(25); rs485TxMsg("\xFF\x02\x00"); state_r2 = 0;}
    if ((strcmp(TRAME[1], "2") == 0) && (strcmp(TRAME[2], "1") == 0)) { delay(25); rs485TxMsg("\xFF\x02\x01"); state_r2 = 1;}
    else { }
  }
}

La fonction strcmp me semble être la plus judicieuse, car plus souple. J'ai constaté que l'ecriture est relativement stricte.

Ceci ne fonctionne pas par exemple :

if (TRAME[0] == "T")

Je ne suis pas fort en pointer :blush:

J'aimerais savoir si il existe d'autres possibilités, quelle est la meilleur, existe-t'il des fonctions similaires pour comparer un pointer à un int ou un float ???

Merci d'avance :wink:

@+

Zoroastre.

Bonjour,

J'avoue avoir lu ton post un peu en diagonal vu la tartine de code qu'il inclut :slight_smile:

zoroastre:
J'aimerais comparer ces références à d'autres variables/valeurs afin d'effectuer des actions.
La trame pourrait ressembler à ceci à peu de chose prés : {RELAIS, 1, 1} = On active le relais 1. {Action, num, state}

J'ai regardé ton code qui me semble bien compliqué pour le résultat voulu.
J'aurai fait d'une autre facon.
tu crée un tableau de char buf par exemple de disont 24 caracteres,
avec un while tu boucle tant que tu ne vois pas un {
des que tu à le { tu remplit le tableau buf en partant de l'index 0 jusqu'a avoir une virgule (et si âpres 23 caractères il n'y a toujours pas de virgule tu arréte tout),
des que tu la une virgule tu ajoute \0 à la fin de buf (via un buf[index++] = '\0' par exemple) pour crée une string,
tu compare via une simple boucle cette string avec celle deja en mémoire ("relay", etc, etc) et tu affecte un numéro à cette string en retour (par exemple si string = "relay" tu attribut 1)
ensuite tu zape les espaces,
des que les espaces sont zapé tu recommence à remplir buf depuis l'index 0 avec les char qui arrive jusqu'a avoir la prochaine virgule,
tu ajoute le \0 à la fin,
et tu fait un atoi() (voir syntax sur google) pour convertir la string en integer que tu garde dans un variable,
tu refais la même chose pour le second chiffre mais cette fois tu rempli jusqu'a avoir un },
tu refais un atoi() que tu garde de coté dans une variable,
et finalement tu peut appeler une fonction fairequelquechose(numérodelaction, argments1, arguments2).

zoroastre:
Ceci ne fonctionne pas par exemple :

if (TRAME[0] == "T")

Remplace les " " par des ' ', les " " indique une chaine de caractères or il n'est pas possible via un if de vérifier une chaine de caractères.
Avec ' ' comme 'A', c'est un caractère seul et comparé deux type simple est possible avec un if.

Yep!

J'ai choisi cette solution car ainsi je peux compléter ma trame de differentes manières, avec toutes sortes de données. Le premier argument TRAME[0] peut être "relais", "timer", "led", "buzzer" ou autre. Et c'est clairement par sens pratique que j'ai dissocié la fonction de réception de celle supportant les actions.

or il n'est pas possible via un if de vérifier une chaine de caractères

Voilà la confirmation que je subodorais !!! ...D'où TRAME[0][0]...

Je précice également que la trame peut comprendre des valeurs flottantes. C'est peut être aussi une explication relative à la complexité apparente de mon code :wink:

Je vais encore tester la fonction strcmp que je ne connaissais pas il y a deux jours XD

Encore merci Skywodd !

@+

Zoroastre.