MQTT - conversion String array -> int array

Bonjour,

Je tente d’écrire une fonction qui récupère le contenu d’un payload de 4 digits, par exemple 3728 avec l’objectif final de placer chaque membre dans une variable distincte.

var[0] = 3; var[1] = 7, var[2] =2 …

Je suis coincé sur la conversion du tableau d’entier.

//function "macro" pour traiter le message MQTT arrivant au MC et retourner la partie utile : un entier
int payloadToInts(byte* payload, int length) {

  String payloadFromMQTT[4];

//itérer dans toute la longueur message, length est fourni dans le callback MQTT
   for (int i = 0; i < length; i++) { 

    if (isDigit(payload[i]))// tester si le payload est bien un chiffre décimal
      payloadFromMQTT[i] += (char)payload[i];//caster en type char et ajouter/placer dans un tableau d'entier
  }

  return payloadFromMQTT[].toIntArray();//MARCHE PAS : convertir le tableau de String en tableau d' entiers et retourner la valeur
}

Tout compile jusque la dernière ligne qui ne passe pas.

QUESTION : comment convertir mon tableau payloadFromMQTT en tableau d’entiers ?

il y a la fonction [url=http://www.cplusplus.com/reference/cstdlib/atoi/]atoi()[/url]ou [url=http://www.cplusplus.com/reference/cstdlib/atol/]atol()[/url] par exemple
cf les fonctions des librairies standard suivantes: stdlib.h et string.h

(attention ces fonctions vont retourner 0 s'il n'y a pas de nombre correspondant, donc pas moyen de différentier si l'utilisateur à envoyé 0 ou s'il y a eu une erreur au décodage --> tester si le premier caractère est un chiffre ou le signe + ou - par exemple pour vous en assurer)

RomainL:

  payloadFromMQTT[i] += (char)payload[i];//caster en type char et ajouter/placer dans un tableau d'entier

2 erreurs dans cette ligne : si payload est la chaine “3728”, alors payload[0] vaut ‘3’, c’est à dire le caractère 3, c’est à dire en ASCII la valeur 0x33 (regarde une table ASCII). Donc la formule correcte est

int valeur = payload[i] - '0'; // '0' vaut 0x30

la seconde erreur est le signe += : en fait il est inutile car tu ajoutes qqchose à une String vide. Autant utiliser le signe = tout seul.
Et puis pour faire ce que tu veux, il est totalement inutile de s’embrouiller avec des Strings. Voici le code :

void payloadToInts ( const byte* payload, int length, int* valeurs ) {


  // itérer dans toute la longueur message, length est fourni dans le callback MQTT
  for (int i = 0; i < length; i++) { 
    if (isDigit(payload[i])) // tester si le payload est bien un chiffre décimal
      valeurs[i] = payload[i] - '0'; // garder valeur entre 0 et 9
    else
      valeurs[i] = -1; // signaler une erreur
  }
}