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 :

Conversion type double en char


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Par défaut Conversion type double en char
    Bonjour,

    J'ai une fonction "get" qui doit me retourner un enregistrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char * MonCatalogue_getPrix(MonCatalogue * cat) {
        return cat->Prix;
    }
    Le soucis c'est que le type 'Prix' est un double, et la fonction doit retourner un pointeur sur char (char*).

    J'ai donc essayé de 'caster' en mettant (char) ou (char*) mais sans succès.


    PS: je suis vraiment débutant, donc désolé par avance si ma question peut sembler idiote

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Le soucis c'est que le type 'Prix' est un double, et la fonction doit retourner un pointeur sur char (char*).
    Le soucis, surtout, c'est que c'est pas logique cette histoire. Si la fonction doit retourner le prix, il faut retourner un type double.
    Pourquoi devrait-elle retourner un pointeur sur char ? Cela voudrait dire qu'elle renvoie une chaine de caractères.

    Est-ce un exercice ? Quel est l'intitulé exact ?

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 483
    Par défaut
    effectivement cela paraîtrai plus logique...

    mais oui, il s'agit d'un exercice, et la fonction doit retourner un char*, donc je ne vois pas trop comment faire dans ce cas

    l'intitulé est : fonction permettant d'obtenir une copie sur le tas de la valeur du champs d'un enregistrement sous forme de chaîne de caractère

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par piero53 Voir le message
    J'ai donc essayé de 'caster' en mettant (char) ou (char*) mais sans succès.

    PS: je suis vraiment débutant, donc désolé par avance si ma question peut sembler idiote
    Oui, on voit effectivement que tu es un peu dans le noir.

    Faut bien comprendre qu'un cast ne sert à rien dans ce cas. En fait, le cast sert quand on a le bon contenu mais pas la bonne étiquette. Par exemple t'as un double (8 octets) mais tu n'as que l'adresse du premier de ces 8 octets et pour tout un tas de raisons valables, le compilo croit que cette adresse est l'adresse d'un char (1 octet). Si tu demandes au compilo de te donner le contenu, il te donnera un char (1 octet) et te manquera les 7 autres.
    Donc dans ce cas précis, tu peux utiliser un cast pour dire au compilo "considère cette adresse comme l'adresse d'un double pour récupérer son contenu" et il te donner alors les 8 octets.

    Dans ton cas à toi, t'as Prix qui vaut on va dire 12.25 mais ce 12.25 est codé au format double, avec la mantisse, l'exposant, le signe. Bref peut-être que le codage est 0xA1FE2410. Ben en castant en char*, tu récupèreras le caractère de code ascii A1 suivi du caractère de code ascii FE suivi du caractère de code ascii 24 suivi du caractère de code ascii 10. Bref peut de rapport avec "12.25"...

    Citation Envoyé par piero53 Voir le message
    l'intitulé est : fonction permettant d'obtenir une copie sur le tas de la valeur du champs d'un enregistrement sous forme de chaîne de caractère
    Faut que ta fonction
    1) prévoie une chaine suffisamment grande pour stocker la représentation littérale du prix (par exemple si le prix est 12.25 ben faut que ta chaine contienne 5 caractères + le '\0'). Ici malloc te servira
    2) remplisse cette chaine avec "12.25" (sprintf() te sera très utile)
    3) renvoie l'adresse de début de cette chaine
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    ben c'est pas un cast, c'est une copie sous forme de chaine de caratère que tu dois avoir. Si ton double c'est 2.12345 ça fera une chaine de 7 caractères plus la fin de chaine.
    Regarde du coté de la fonction (GNU) asprintf().

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    l'intitulé est : fonction permettant d'obtenir une copie sur le tas de la valeur du champs d'un enregistrement sous forme de chaîne de caractère
    Dans ce cas, si je comprends bien, il faut convertir un nombre en une chaine de caractère qui le représente. Exemple, conversion du nombre 12345.6789 en chaine "12345.6789".

    Il faut déjà connaitre le nombre maximal de caractères que la chaine contiendra. Comme on n'est pas censé la connaitre (vu que le nombre peut être plus ou moins grand), tu peux utiliser une valeur arbitraire qui correspondra au nombre maximal de caractère qui ne sera jamais dépassé.
    Tu peux créer un tableau local à la fonction de cette taille, que tu te servira pour convertir le nombre en chaine de caractères. Pour la conversion, tu peux utiliser la fonction sprintf.
    Ensuite, tu calcules la longueur réelle de cette chaîne via strlen, dont tu te serviras pour allouer de la mémoire sur le tas (grâce à malloc), sans oublier de rajouter 1 à la taille (pour le '\0' de fin). Il faut bien vérifier que malloc n'a pas échoué.
    Puis si tout est bon, il suffit de copier le tableau local vers la mémoire allouée grâce à strncpy.
    Puis tu retournes l'adresse de la mémoire allouée.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Dans ce cas, si je comprends bien, il faut convertir un nombre en une chaine de caractère qui le représente. Exemple, conversion du nombre 12345.6789 en chaine "12345.6789".

    Il faut déjà connaitre le nombre maximal de caractères que la chaine contiendra. Comme on n'est pas censé la connaitre (vu que le nombre peut être plus ou moins grand), tu peux utiliser une valeur arbitraire qui correspondra au nombre maximal de caractère qui ne sera jamais dépassé.
    Tu peux créer un tableau local à la fonction de cette taille, que tu te servira pour convertir le nombre en chaine de caractères. Pour la conversion, tu peux utiliser la fonction sprintf.
    Ensuite, tu calcules la longueur réelle de cette chaîne via strlen, dont tu te serviras pour allouer de la mémoire sur le tas (grâce à malloc), sans oublier de rajouter 1 à la taille (pour le '\0' de fin). Il faut bien vérifier que malloc n'a pas échoué.
    Puis si tout est bon, il suffit de copier le tableau local vers la mémoire allouée grâce à strncpy.
    Puis tu retournes l'adresse de la mémoire allouée.
    On peut peut-être se passer du tableau local. Certes on est obligé d'allouer alors une taille arbitraire pour toute chaine quelle qu'elle soit mais la perte est-elle si importante ???

    Ou alors on peut compter le nombre de caractères nécessaires en analysant le prix (le nb de digits d'un nombre entier "n" est donné par E(log(n - 1)/log(10)) + 1). Bon, ok, calculs lourds là ou un tableau intermédiaire suffit mais c'était pour donner d'autres possibilités...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    On peut aussi obtenir le nombre de caractères nécessaire et suffisant pour le tableau via snprintf(). Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      double x = 1.23456789;
      const char * format = "%.8f";
      int n = snprintf(NULL,0,format,x);
      char *tab = malloc(n+1);
      snprintf(tab,n+1,format,x);

Discussions similaires

  1. Conversion d'un type word en char
    Par bleuerouge dans le forum Débuter
    Réponses: 6
    Dernier message: 20/06/2008, 15h52
  2. Conversion de chaîne "" en type Double non valide
    Par vérokit dans le forum VB.NET
    Réponses: 2
    Dernier message: 10/04/2008, 08h14
  3. Réponses: 16
    Dernier message: 06/06/2007, 15h46
  4. Conversion de type double en texte
    Par CoachMac dans le forum C
    Réponses: 17
    Dernier message: 14/10/2006, 19h29
  5. Conversion de type string en char ?
    Par CoachMac dans le forum C
    Réponses: 18
    Dernier message: 08/08/2006, 10h20

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