Go Down

Topic: Conversion d'un tableau de float en chaine de caractère (Read 389 times) previous topic - next topic

Felicien9

Bonjour, j'aimerai convertir un tableau de valeur float en char ou en string, quelqu'un saurait m'aider?
J'ai fais ceci qui ne fonctionne pas.

Code: [Select]
   float tabVal[]={10.12,14,18.6};
  char tabChaine[30];
  sprintf(tabChaine, "%f-%f-%f",tabVal[0],tabVal[1],tabVal[2]);

Merci d'avance

kamill

Bonjour,

Le format %f ne fonctionne pas par défaut avec les processeurs avr
Tu peux utiliser dotostrf()

Felicien9

Merci pour votre réponse rapide, vous parlez de dtostrf j'imagine? J'arrive a convertir un float mais pas un tableau de float...

kamill

Oups! Effectvement dtostrf()
Pour le tableau, il suffit de faire une boucle.

Felicien9

J'ai essayé en faisant comme ça :
Code: [Select]
   float tabVal[]={10.12,14,18.6};
  char tabChaine[30];
  for(int i=0;i<3;i++)
  {
    dtostrf(tabVal[i],30,2, tabChaine);
  }
  Serial.println(tabChaine);


Mais il m'affiche que le dernier nombre de "tabVal" ce qui est normal je pense, il faudrait que quand je tourne dans le tableau, les valeurs viennent se mettre à la suite de la chaine de caractère, comment je peux faire? Ou concaténer?
Merci de votre aide

dbrion06

Une solution lourde serait
Code: [Select]

char final[100]="";
  char tabChaine[30];
  for(int i=0;i<3;i++)
  {
    dtostrf(tabVal[i],30,2,tabChaine );
    strcat(final, tabChaine);
  }

====
edited : avez vous besoin de 30 caractères pour coder un float avec deux chiffres décimaux?
Une solution moins obèse -je réserve 100 octets; même si je devais n'en reserver que 30*3 + 1, c'est gros -serait d'imprimer au fur et à mesure que les sous chaînes sont créées...)
Si vous avez besoin de 30 caractères, dimensionnez tabChaine à 31 (pour le terminer par NULL...)

Felicien9

Je savais pas si le 30 était pour l'ensemble du tableau de float ou si c'était pour une seul float. Merci de votre aide, je pense que ça va fonctionner maintenant.

J-M-L

à quoi va servir tabChaine ?? en avez vous vraiment besoin?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Felicien9

Je dois envoyer un tableau de float sur un BDD MYSQL par PHP et je pense que cela sera plus facile avec une chaine de caractère

J-M-L

vous pouvez l'envoyer en plusieurs bouts...

Code: [Select]
client.print(tabVal[0],2); // le 2 pour 2 chiffres après la virgule
client.print("-");
client.print(tabVal[1],2);
client.print("-");
client.print(tabVal[2],2);
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Felicien9

Je pense au deux mais je voulais essayer les deux parce que je dois envoyer un tableau[6][3] ce qui est assez long à envoyer. Ca va faire un GET fort à rallonge que je devrais probablement faire en plusieurs fois

J-M-L

La façon de générer le GET n'a aucune importance du côté réception... et si vous savez un tableau c'est hyper simple de faire deux boucles imbriquées  pour générer la requête

Si votre GET est trop long passez en POST
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Felicien9

D'accord merci de votre aide, j'avais déjà essayé avec une boucle mais ça n'avait pas trop été. Je vais réessayer et je reviens vers vous si ça ne va pas.

J-M-L

ce n'est quand même pas très compliqué d'écrire une boucle qui parcourt le tableau

voici un exemple
Code: [Select]
uint8_t tableau[6][3] = {
  {0, 1, 2},
  {1, 12, 13},
  {2, 21, 22},
  {3, 31, 32},
  {4, 41, 42},
  {5, 51, 52}
};

void setup() {
  Serial.begin(115200);

  for (uint8_t i = 0; i < 6; i++) {
    for (uint8_t j = 0;  j < 3; j++) {
      Serial.print(F("tableau["));
      Serial.print(i);
      Serial.print(F("]["));
      Serial.print(j);
      Serial.print(F("] = "));
      Serial.print(tableau[i][j]);
      if (j != 2) Serial.print(F("\t")); // on ne sépare avec une tabulation que si on n'est pas au dernier élément
    } // fin de boucle j
    Serial.println(); // on saute une ligne (par exemple)
  } // fin de boucle  i
}

void loop() {}


vous verrez dans la console série (réglée à 115200 bauds)

tableau[0][0] = 0   tableau[0][1] = 1   tableau[0][2] = 2
tableau[1][0] = 1   tableau[1][1] = 12   tableau[1][2] = 13
tableau[2][0] = 2   tableau[2][1] = 21   tableau[2][2] = 22
tableau[3][0] = 3   tableau[3][1] = 31   tableau[3][2] = 32
tableau[4][0] = 4   tableau[4][1] = 41   tableau[4][2] = 42
tableau[5][0] = 5   tableau[5][1] = 51   tableau[5][2] = 52


ou si vous voulez tout écrire sur une seule ligne (comme pour un GET)
Code: [Select]
uint8_t tableau[6][3] = {
  {0, 1, 2},
  {1, 12, 13},
  {2, 21, 22},
  {3, 31, 32},
  {4, 41, 42},
  {5, 51, 52}
};

void setup() {
  Serial.begin(115200);
      Serial.print(F("GET /envoyer?"));
  for (uint8_t i = 0; i < 6; i++) {
    for (uint8_t j = 0;  j < 3; j++) {
      Serial.print(F("t"));
      Serial.print(i); // pas de séparateur des indices car on sait qu'ils ne sont que sur 1 caractère
      Serial.print(j);
      Serial.print(F("="));
      Serial.print(tableau[i][j]);
      if ((i != 5) && (j != 2)) Serial.print(F("&")); // on ne met rien à la toute fin
    } // fin de boucle j
  } // fin de boucle  i
}

void loop() {}


vous donnera
GET /envoyer?t00=0&t01=1&t02=2t10=1&t11=12&t12=13t20=2&t21=21&t22=22t30=3&t31=31&t32=32t40=4&t41=41&t42=42t50=5t51=51t52=52


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Felicien9

Merci beaucoup, j'ai fait un défilement de tableau du même style et qui fonctionne aussi mais sans la tabulation après chaque donnée. Maintenant il faut que j'arrive a récupérer tout ça en php... Merci de votre aide :)

Go Up