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 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 - 29 mars 2013 à 00:08
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.

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:

3 réponses

mamiemando Messages postés 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 7 777
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.

#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
1
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
Re bonjour,
...
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
0
mamiemando Messages postés 33266 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 septembre 2024 7 777
29 mars 2013 à 00:08
Chez moi ça marche... Mais "long" signifie "long int" or tu l'affiches comme un float...

#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
0