Découper une trame

Déjà, je ne suis pas sûr que ceci soit bon, car il n’y aura pas de caractère 0 à la fin

tableau[i] = pch;

Ensuite, il faudrait aussi le code de la fonction…

Voilà le code de la fonction "fonction"

void fonction (int i, char val)
{
  switch (i) {
    case 0: 
     Serial.println(val);
      break;
    case 1: 
     Serial.println(val);
      break;
    case 2: 
     Serial.println(val);
      break;
}
}

Pour l'instant il n'y a pas vraiment de code. Déjà vérifier que la valeur est bien prise en compte. A l'avenir "val" sera un nombre entier ou flottant.

void fonction (int i, char val)
{
  if (i >= 0 && i <= 2) {
     Serial.println(val);
  }
}

Ce n'est pas le but de ma fonction TheMember. "val" est différent si i vaut 0, 1 ou 2. Sinon oui l'utilisation d'un if était une bonne idée.

Essaye ceci :

char tableau[19];
char * pch;

void decoupe_message(char trame[100])
{
  pch = strtok (trame, "<>,");
  int i = 0;
  while (pch != NULL)
  {
      tableau[i] = pch;
      Serial.print ("tableau[");
      Serial.print  (i);
      Serial.print  ("] : ");
      Serial.println  (pch);
      fonction (i, pch);
      pch = strtok (NULL, "<>,");
      ++i;
     }
}

et mets dans ta réponse ce qui s’affiche dans la console.

EDIT : es-tu sûr que ça compile ? pch est un char* et l’argument de ta fonction (val) est un char !

Merci pour ton aide lesept ! J'obtiens bien quelque chose de cohérant. Oui tout compilais parfaitement, je me suis perdu avec la notion de pointeur et variable je pense. J'ai fais l'erreur aussi de déclarer ma fonction en char alors qu'elle ne retourne rien :roll_eyes:

Voici ce que j'obtiens : tableau[0] : AAAA AAAA tableau[1] : BB.BB BB.BB ...

Par contre, dans mon programme "fonction", je suis obligé de mettre "Serial.println(pch)" et non pas "Serial.println(val)" car sinon j'obtiens des caractères incohérents.

OK; bonne continuation !

Saurais tu m'expliquer pourquoi dans mon programme "fonction", je dois écrire :

Serial.println(pch);

Et non pas :

Serial.println(val);

Je saisi pas bien. "val" prends la valeur de "pch" non ?

Je suis mal à l'aise avec les pointeurs, mais déjà si pch est une variable globale, tu n'as pas besoin de la passer en argument d'une fonction puisqu'elle est connue dans tout le code.

Je crois que passer un pointeur à une fonction permet de modifier la valeur dans la fonction et de renvoyer la valeur modifiée. Mais le pointeur est dans la déclaration de la fonction pas dans l'argument passé... Voir ici : passage de variable par valeur ou par référence (il y a d'autres tutos sur le sujet)

Je pense que comme tu le fais, val contient l'adresse du pointeur (modulo la taille d'un int) et non la valeur de ce qui s'y trouve. Mais comme pch est globale, le Serial.print(pch) permet d'afficher la valeur.

D'autres membres qui connaissent mieux les pointeurs pourront certainement mieux expliquer ...

Strtok découpe directement dans la cString d’origine en mettant des caractères nuls sur les séparateurs et en vous rendant un pointeur au sein de la chaîne, au début du token en cours.

Donc pour stocker les addresses de début des sous chaînes il faut que tableau soit un tableau de pointeurs au sein de la chaîne. char* tableau[19]; // s’assurer que 19 c’est suffisantet ces pointeurs ne restent valides que tant que la chaîne n’est pas réutilisée, sinon ils pointeront dans la nouvelle chaîne un peu n’importe où.

Je suis moi aussi très mal à l’aise avec les pointeurs. C’est une notion que je ne maitrise pas bien du tout.
Je ne savais plus que c’était une variable globale, tu as bien fais de me le rappeler !
Tu as raison, je vais me renseigner la dessus mais ton explication est déjà clair.

Merci J-M-L, j’ai déclaré le tableau en tableau de pointeurs comme préconisé.
Normalement 19 c’est suffisant pour mon application.

J’ai un tuto pour vous aider ;)

Introduction à la mémoire et aux pointeurs sur Arduino

Ca me fait penser à la pub Iphone : "J-M-L : il a aussi un tuto pour ça" ... ;)

LOL :)