Numérique en chaine et concaténation

Résolu
PascalJ74 Messages postés 2 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    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
  2. PascalJ74 Messages postés 2 Statut Membre
     
    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
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    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