Numérique en chaine et concaténation
Résolu
Bonjour,
Après des heures à chercher et essayer de comprendre pourquoi j'ai une erreur de compilation (invalid conversion from 'char' to const char*) je viens solliciter votre aide :
Mon projet est le suivant :
j'ai 2 capteurs par lesquels j'obtient une valeur numérique (pression atmosphérique et température) ces 2 valeurs doivent ensuite etre intégrées dans un chaine afin de calculer un crc.
Mon problème est que je n'arrive pas à obtenir une chaine contenant les 2 numériques qui auront été transformés.
J'obtiens une erreur de compilation sur la première ligne strcat.
Qui pourrais me dire comment obtenir au final la chaine :
nmea="WIMDA,,I,101325,B,20.55,C,,C,,,,C,,T,,M,,N,,M";
afin que cette chaîne puisse servir au calcul d'un crc
merci
Après des heures à chercher et essayer de comprendre pourquoi j'ai une erreur de compilation (invalid conversion from 'char' to const char*) je viens solliciter votre aide :
Mon projet est le suivant :
j'ai 2 capteurs par lesquels j'obtient une valeur numérique (pression atmosphérique et température) ces 2 valeurs doivent ensuite etre intégrées dans un chaine afin de calculer un crc.
Mon problème est que je n'arrive pas à obtenir une chaine contenant les 2 numériques qui auront été transformés.
char *nmea; int baro = 101325; int temp = 10.25; nmea="WIMDA,,I,"; char cbaro=printf("|%10.4f|\n",101325); char ctemp=printf("|%10.4f|\n",10.25); strcat(nmea,cbaro); strcat(nmea,ctemp); strcat(nmea,",C,,C,,,,C,,T,,M,,N,,M");
J'obtiens une erreur de compilation sur la première ligne strcat.
Qui pourrais me dire comment obtenir au final la chaine :
nmea="WIMDA,,I,101325,B,20.55,C,,C,,,,C,,T,,M,,N,,M";
afin que cette chaîne puisse servir au calcul d'un crc
merci
A voir également:
- Numérique en chaine et concaténation
- Télévision numérique - Guide
- Télévision numérique terrestre - Accueil - TV & Vidéo
- Chaine tnt gratuite sur mobile - Guide
- Pavé numérique bloqué - Guide
- Clavier numérique bloqué - Guide
3 réponses
En fait c'est parce que tu as mal interprété la signification de la valeur de retour de printf (qui retourne le nombre de caractère affichés) :
http://manpagesfr.free.fr/man/man3/printf.3.html
Si tu veux formater ta chaîne, tu dois passer par un buffer intermédiaire, dans lequel tu peux écrire par exemple à l'aide de la fonction sprintf.
Note qu'ici vu qu'on ne fait rien du buffer à par l'afficher on pourrait aussi directement écrire :
Bon maintenant, vu que tu as posté dans la fonction dans la section c++ du forum, il faudrait en C++ inclure <cstdio> au lieu de <stdio.h>, ou mieux, utiliser la classe std::ostringstream.
De la même façon que pour "buffer" dans l'exemple du dessus, on pourrait ici éviter de passer par "oss" et envoyer directement le flux texte dans std::cout.
Bonne chance
http://manpagesfr.free.fr/man/man3/printf.3.html
Si tu veux formater ta chaîne, tu dois passer par un buffer intermédiaire, dans lequel tu peux écrire par exemple à l'aide de la fonction sprintf.
#include <stdio.h> int main() { char buffer[255]; const char *nmea = "WIMDA,,I,"; float baro = 101325; float temp = 10.25; sprintf(buffer,"%s|%10.4f\n|%10.4f|\n", nmea, baro, temp); printf("%s", buffer); return 0; }
Note qu'ici vu qu'on ne fait rien du buffer à par l'afficher on pourrait aussi directement écrire :
printf("%s|%10.4f\n|%10.4f|\n", nmea, baro, temp);
Bon maintenant, vu que tu as posté dans la fonction dans la section c++ du forum, il faudrait en C++ inclure <cstdio> au lieu de <stdio.h>, ou mieux, utiliser la classe std::ostringstream.
#include <sstream> // std::ostringstream #include <iostream> // std::cout #include <iomanip> // std::setprecision int main() { std::ostringstream oss; const char *nmea = "WIMDA,,I,"; float baro = 101325; float temp = 10.25; oss << nmea << '|' << std::setw(10) << std::setprecision(4) << baro << '|' << std::endl << '|' << std::setw(10) << std::setprecision(4) << temp << '|' << std::endl; std::cout << oss.str(); return 0; }
De la même façon que pour "buffer" dans l'exemple du dessus, on pourrait ici éviter de passer par "oss" et envoyer directement le flux texte dans std::cout.
std::cout << nmea << '|' << std::setw(10) << std::setprecision(4) << baro << '|' << std::endl << '|' << std::setw(10) << std::setprecision(4) << temp << '|' << std::endl;
Bonne chance
Re bonjour,
...
Après avoir implémenté le code nécessaire à la concaténation d'une chaine (merci à mamiemando) j'ai encore un problème avant de toucher au but.
bien qu'ayant demandé à transformer ma valeur (20.5) en chaine à l'aide de l'option %5.2f ma valeurs n'est pas transformée. J'obtiens en lieu et place un ?
le Serial.println(buffer) m'affiche la chaine suivante :
WIMDA,,I,,1008,B, ?,C,,C,,,,C,,T,,M,,N,,M
Comment faire pour avoir 20.5 (numérique à 2 décimales) transformé en une chaine ?
Merci
...
char buffer[82]; const char *nmea = "WIMDA,,I,"; long baro = 1008; double temp = 20.5; //Serial.println(baro); Serial.println(printf("%5.2f",temp)); sprintf(buffer,"%s,%4d,B,%5.2f,C,,C,,,,C,,T,,M,,N,,M",nmea,baro,temp); printf("%s", buffer); Serial.println(buffer); Serial.println(getCheckSum(buffer),HEX); // pour débuguer et connaitre la valeure renvoyée par la fonction
Après avoir implémenté le code nécessaire à la concaténation d'une chaine (merci à mamiemando) j'ai encore un problème avant de toucher au but.
bien qu'ayant demandé à transformer ma valeur (20.5) en chaine à l'aide de l'option %5.2f ma valeurs n'est pas transformée. J'obtiens en lieu et place un ?
le Serial.println(buffer) m'affiche la chaine suivante :
WIMDA,,I,,1008,B, ?,C,,C,,,,C,,T,,M,,N,,M
Comment faire pour avoir 20.5 (numérique à 2 décimales) transformé en une chaine ?
Merci
Chez moi ça marche... Mais "long" signifie "long int" or tu l'affiches comme un float...
... donne :
Bonne chance
#include <stdio.h> int main() { char buffer[255]; const char *nmea = "WIMDA,,I,"; long baro = 1008; float temp = 10.25; sprintf(buffer, "%s,%4d,B,%5.2f,C,,C,,,,C,,T,,M,,N,,M", nmea, baro, temp); printf("%s", buffer); return 0; }
... donne :
WIMDA,,I,,1008,B,10.25,C,,C,,,,C,,T,,M,,N,,M
Bonne chance