IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Construction char* depuis double, int, char


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Construction char* depuis double, int, char
    Bonjour,

    Désolé, le titre n'est pas très explicite.

    je dois écrire sur un port série des trames formées de données variées.

    Le type de chacune de ses données est décrit dans un fichier. Par exemple, la donnée 1 doit être encodée sous la forme d'un entier non signé sur 32 bits.

    Actuellement, ma trame est représentée par un char*. Les données que je dois insérer arrivent sous la forme de double. Je dois donc, par exemple pour la donnée 1, réencoder cette donnée sous la forme d'un entier non signé sur 32 bits puis insérer cet entier non signé dans mon char*.

    Je voulais donc votre avis sur les points suivants :

    Est-ce que cette manière de procéder vous parait adaptée ou voyez vous une solution plus simple ?

    Comment effectuer la conversion d'un double => int non signé et stocker le résultat dans un char* (je ne vois pas transformer 42 en "42" mais trouver le char donc le code binaire est le même que celui du double 42).

    Merci de votre aide.

  2. #2
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Je comprends sûrement mal la question, mais ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    double d = 42.;
    int i = static_cast<int>(d);
    char c[4] = {
       i >> 24,
      (i >> 16) & 0xFF,
      (i >> 8)  & 0xFF,
       i        & 0xFF
    };
    // c[4] est le pointeur sur char que tu souhaites.
    A noter : si j'ai bien compris ta demande, tu vas perdre toutes les décimales de d.

    (A noter bis : attention à l'endianness, mais comme on n'a pas assez de détails je ne sais pas s'il faut en tenir compte.)

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Sinon y'a peut-être moyen de passer par une union :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #include <iostream>
     
    template <typename T> union UType {
    UType() : value(0) {}
    template <typename U> UType(const U& u) : value(static_cast<T>(u)) {}
    T value; char arr[sizeof(T)];
    };
     
    int main(void) {
     double d = 1337.0;
     UType<unsigned int> ut(d);
     
     for (int i=0, iEnd=sizeof(ut); i<iEnd; ++i)
     std::cout << "i[" << i << "] = " << (int)ut.arr[i] << std::endl;
     
    return 0;
     
    }
     
    // En sortie :
    //
    // i[0]=57
    // i[1]=5
    // i[2]=0
    // i[3]=0

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 937
    Points
    4 937
    Par défaut
    le but à la fin c'est de pouvoir retrouver le double ou pas?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Je vais peut etre dire une connerie, mais tu pourrais pas simplement caster en char* ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* data = (char*)&unDouble;
    unsigned int dataSize = sizeof(unDouble);
    A part l'endianess qui pourrait être problématique, ça devrait marcher, non ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/05/2006, 21h42
  2. Création de char depuis valeur decimal
    Par kivan666 dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2006, 11h06
  3. comment convertir un char[] en double
    Par groult jeremy dans le forum C++
    Réponses: 6
    Dernier message: 17/11/2005, 14h49
  4. conversion int---->char
    Par andurand dans le forum C++
    Réponses: 10
    Dernier message: 30/05/2005, 17h36
  5. Réponses: 2
    Dernier message: 01/07/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo