Ma fonction ne me retourne pas l'affiche souhaité

Bonjour à tous,

J’essaye de faire une fonction qui va n’afficher que’une partie de block délimité par des virgules.

Par exemple, j’ai une variable

Serial.println(response[1]);

qui affiche

block0,block1,block2,block3,block4,block5

et j’aimerais afficher (Serial.println) le texte en 2eme position, soit ‘block2’

Alors j’ai fait une fonction qui semble fontionner mais pas parfaitement :wink: . Et je voulais vous demander de m’aider à la vérifier.

Voici la fonction avec mes commentaires:

char * SIM908::get_value(char * chaine, byte index)
{

  // block0,block1,block2,block3

  // Initiate the 
  byte ind = 0; // Position dans laquelle on se trouve (de la variable chaine)
  byte x = 0;   // index de la variable val. Valeur à retourner
  byte ic = 0;  // Index de la variable Chaine
  bool flag = false;  // True quand on est dans la position à retoruner
  char val[10]; // Variable qui contiendra le bloque à retourner. Dans mon cas, il contiendra block2

  // Si on a besoin du premier block, le flag doit est true au commencement
  if(index == 0)
  { 
    flag = true;
  }

  
  do // Lit 'chaine' carcatere par caratere
  {
    switch(chaine[ic]){
      case ',':                 // Si lit une virgule, il va passer sur un autre block, donc 'ind'doit inrementer
        ind++;                  // Voir ensuite de default:
        ic++;                    // Vu qu'il va retoruner au debut de la boucle do, increment ic.
        continue;               // Retourne au debut de la boucle do
      
      default:
        if(ind == index)        // Si ind est egal a index, on est dans le block qui nous intéresse
        {
          val[x] = chaine[ic];  // Alors stock dans val, les caracteres qui nous intéressent 
         // Serial.print(F("Def")); Serial.println(val[x]);
          x++;
        }
    }
    
    ic++;                       // Go to next position of chaine
    //Serial.print(F("co")); Serial.println(co);

  }while( ic < strlen(chaine)); // Fait tant que ic est plus petit que la longuer de 'chaine
  val[x]='\0';  // Termine la valeur a retourner par \0
  
  Serial.println(val);
  return val;   // return la partie/block qui nous intéresse.
}

Voilà, es-ce que j’ai été clair?

Le probleme que j’ai c’est le suivant et je pense que ca doit être un petit truc, que j’ignore :o)

Ceci

Serial.println(get_value(response[1], 2)

m’affiche

V��

Du n’importe quoi :slight_smile:
alors que

Serial.println(val);

m’affiche bien

block2

Pourriez-vous me commenter ma fonction et me dire ce qu’il vous semble pas bien?

Je vous remercie d’avance

En fait la vrai chaine caratere que je veux tester c'est

+CENG:0,0872,21,99,228,02,11,7979,10,00,1770,255

block0,block1, ect, j'ai pris ca comme exemple.

Et les partie que je veux extraire sont 228,02,7979 et 1770 soit

Serial.println(get_value(response[1],4));
Serial.println(get_value(response[1],5));
Serial.println(get_value(response[1],7));
Serial.println(get_value(response[1],9));

Voili, voilà

J'ai pas trop essayé de comprendre ton code. Mais déjà continue ne s'utilise pas de cette façon. continue s'utilise dans un for, un loop ou un while. Mais pas dans un switch. A la fin d'un case normalement on utilise break qui empêche l'exécution des autres case. voir là:http://www.areaprog.com/c/article-8-instructions-pratiques-explications-des-ruptures-de-sequences

Personnellement je ne ferais pas un do{}while mais plutôt un while{} ou alors il faut tester avant d'entrer dans le do si la chaîne passée en argument n'est pas vide.

val est une variable locale à la méthode get_value. Elle n'a pas d’existence en dehors de cette méthode. Dès que tu sors de get_value la zone mémoire peut être ré-allouée. Si tu veux pouvoir exploiter la contenu de val ailleurs, il faut soit utiliser une variable globale de la librairie déclarée comme public, soit passer la variable en argument à l'appel de cette méthode.

fdufnews: val est une variable locale à la méthode get_value. Elle n'a pas d’existence en dehors de cette méthode. Dès que tu sors de get_value la zone mémoire peut être ré-allouée.

Salut fdufnews, C'est intéressant ca. Oui je savait qu'un variable local ne peut pas être utilisée en dehor de sa propre fonction. Masi dans mon cas, je ne l'utilise pas en dehor, je retourne sa valeur.

return val;

Donc la valeur de val est retournée bien avant de la fin de la fonction, donc avant que val perde sa valeur. Donc es-ce que c'est faux de faire comme ceci? (J'ai pris note de ta remarque sur 'continue')

val est un pointeur. C'est le pointeur qui est retourné. La zone mémoire associée est libérée à la sortie de la fonction.