Numérique en chaine et concaténation
Résolu/Fermé
PascalJ74
Messages postés
2
Date d'inscription
dimanche 24 mars 2013
Statut
Membre
Dernière intervention
28 mars 2013
-
24 mars 2013 à 21:37
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 29 mars 2013 à 00:08
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 29 mars 2013 à 00:08
A voir également:
- Numérique en chaine et concaténation
- Pavé numérique bloqué - Guide
- Chaine tnt gratuite sur mobile - Guide
- Clavier numérique bloqué - Guide
- Nouvelle chaîne tnt gratuite 2024 - Accueil - TV & Vidéo
- Plus de chaine tv - Guide
3 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
25 mars 2013 à 19:38
25 mars 2013 à 19:38
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
PascalJ74
Messages postés
2
Date d'inscription
dimanche 24 mars 2013
Statut
Membre
Dernière intervention
28 mars 2013
28 mars 2013 à 14:00
28 mars 2013 à 14:00
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
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
29 mars 2013 à 00:08
29 mars 2013 à 00:08
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