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 :

void* et float/double


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 37
    Par défaut void* et float/double
    Bonsoir,

    Un petit probleme de passage de variable se pose dans mon programme:

    J'enumere les differents specifiers a l'aide de l'utilisation de pointeurs sur fonctions et avec les va_arg je suis oblige d'envoyer un void* pour l'envoi des donnees a mes fonctions. (mmm c'est pas clair )

    Exemple:
    j'ai sa dans mon main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     while (gl_specifier[count].specifier != 0)
                {
                  if (gl_specifier[count].specifier == *str)
                    gl_specifier[count].ptr_func(va_arg(va, void*), &gl_option);
                  count++;
                }
    et en resume j'envoi l'argument de type void* a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void            float_number(float nb, t_option *gl_option)
    {
    printf("%f", nb);
    }
    donc void* -> float.

    Mais le printf m'affiche 0.0000... Le float est donc mal transfere et je ne vois pas comment faire autrement...

    Si quelqun a une idee

    Merci!

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Pourquoi tu n'utilises pas tout simplement le type float au lieux de void* dans ta macro va_arg

    Après pourquoi ça ne fonctionne pas avec le type void je ne suis pas sûr ...
    Et pour ne pas dire de bêtises je ne vais pas me prononcer

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 37
    Par défaut
    En faite, ca ne pointe pas que sur cette fonction qui recoit un float, sa pointe sur des fonctions recevant des int, des char donc non je ne peux pas

  4. #4
    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
    je ne suis pas sûr d'avoir compris ton problème.

    Ce que je crois avoir compris :
    gl_specifier est un tableau de structures dont un des champs ptr_func est un pointeur sur une fonction dont les arguments sont du type void * et t_option * et qui retourne void.

    float_number est une de ces fonctions. Son prototype doit donc être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void float_number( void *, t_option *)
    Dans le code, il faut restituer le type exact du premier argument (et ne pas se tromper)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void float_number(void * pnb, t_option *gl_option)
    {
         printf("%f", *(float*)pnb);
    }

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 37
    Par défaut
    Merci pour ta reponse diogene,
    Effectivement c'est ca,
    une autre de mes fonctions qui recoit un void* (et qui fonctionne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void            decimal(void* va, t_option *gl_option)
    {
      my_put_nbr((int)va);
    }
    et dans cette fonction le nombre va est bien restitue.

    Apres l'ajout de tes modifications ca compile mais j'ai le warning suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    specifier_1.c:58: warning: incompatible implicit declaration of built-in function 'printf'
    et donc comme j'envoi un mauvais type a printf un beau segfault apparait lors de l'execution du soft :/

  6. #6
    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
    as-tu inclus <stdio.h> ?
    Si oui, montre le code incriminé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage des floats/doubles
    Par Zenol dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 11/11/2008, 23h15
  2. Probleme de float/double
    Par serebei251 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 24/05/2008, 20h25
  3. float, double et arrondi
    Par simla dans le forum Langage
    Réponses: 2
    Dernier message: 25/08/2007, 15h22
  4. Problème de conversion float -> double
    Par Oberown dans le forum C#
    Réponses: 3
    Dernier message: 05/06/2007, 09h23
  5. [Float || Double] positionement d'un point et precision
    Par TabrisLeFol dans le forum Langage
    Réponses: 5
    Dernier message: 29/06/2006, 09h56

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