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 :

#DEFINE et transtypage


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut #DEFINE et transtypage
    Salut,

    j'ai une petite question.

    J'ai defini un PI de la sorte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #DEFINE PI 3.141592653589793
    et je l'utilise de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float angle = (degres/180.0f) * (float)PI;
    ce que je voudrais savoir, c'est pourquoi je dois mettre (float) devant PI pour eviter les warning a la compil.
    Apparemment Pi est defini comme double par le #define (enfin c'est ce que j'en deduit en lisant le warning).
    Ne peut-on pas le forcer en float avec le #define ?

    Merci

  2. #2
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut
    euh petit ajustement.
    En fait que je mette (float) ou pas devant PI, j'ai le warning :
    warning C4244: 'initializing' : conversion from 'double' to 'float', possible loss of data

    Donc je reformule ma question:
    Comment eviter ce warning?

    Merci.

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    Par defaut tout DEFINE numerique à virgule flotante est considéré comme double. Pour le definir comme un float :

    #define PI 3.1459f

    Voila.

  4. #4
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut
    ah bin comme ca c'est plus clair

    merci

  5. #5
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    et puisqu'on est sur un forum C++, autant faire du C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const double PI = 3.141592653589793;

  6. #6
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut
    quel est la difference

    #define est reservé au C.

    Enfin quand je dis reservé je veux dire plus approprié

  7. #7
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    #define n'est pas réservé au C, disons qu'en C++ #define existe toujours pour des raisons de compatibilité avec le C et pour le préprocesseur (pour éviter l'inclusion multiple d'un fichier d'entête par exemple).

    L'avantage de la notation const double PI = 3.141592653589793; est que ta constante est typée, donc le compilateur peut faire plus de vérifications (d'ailleurs ici tu peux choisir le type double ou float comme ça t'arrange).

  8. #8
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Tu peux aussi caster le type direct dans le define.

    En ajoutant f à la fin de ton chiffre comme le souligne mtopoloff.

    Le define remplace simplement une chaine de caractère par une autre.
    C'est pas le define qui défini un type double ou pas, mais c'est le compilateur qui voit que le code 3.14 possède une virgule et qu'il le considère double ou pas lorsque celui ci est placé dans le code !

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    C'est l'un des meilleurs gars ce Ti-R... Il est vraiment parfait.

  10. #10
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    perso je croie

    #define est une directive preprocesseur donc avant la compliation le compilateur va remplacer les macro par l'eur valeur literaire ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #define somme 4+5
     
    int main(int argc,char* argv[])
    {
    cout<<somme<<end;
     
    }
    le preprocesseur fera

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    int main(int argc,char* argv[])
    {
           cout<<4+5<<end;
    }
    puis le code sera compiler
    et 4+5 sera remplacer par 9 a l'execution;

    tandisque le meme code avec aulieux de #define un const int somme =4+5;

    le code sera compiler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc,char* argv[])
    {
           cout<<somme<<end;   
    }
    et somme sera remplacer par 9 a l'execution

    donc ici #define resemble plus a un fonction inline() que a une variable global constante

    mais ces pas toujour toute vrai ce que je dit
    vous pouvez me corriger

    Yo!

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est encore pire. Si dans ton exemple, on écrit :
    Alors, avec define, c'est équivalent à
    Et l'affichage sera 14, au lieu de 18 comme on aurait pu le croire...

    En résumé : Ne pas utiliser les defines sauf quand on n'a pas le choix, c'est à dire en gros :
    - Pour faire de la compilation conditionnelle
    - Quand on a besoin de # ou ## dans le corps du define
    - Quand on veux utiliser __LINE__ ou équivalent
    - Quand le bout de code qu'on remplace n'est pas une entité de code complète (genre #define LOG if(! logEnabled) ; else log destiné à être utilisé : LOG << "Toto"
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut
    Mon dieu, je ne soupconnais meme pas le dixieme de tout ca...
    Enfin merci pour les explications, c'est encore plus clair maintenant.

    et je vais utiliser une belle constante typée



    NB: ca fait quand meme du bien a son intelligence de venir ici, le nombre de truc que j'ai appris, c'est formidable.
    Merci a tous et continuez

    NB2: bin oui un peu de pommade ca fait pas de mal, et pis j'avais envie de le dire.

  13. #13
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut
    Bon bin c'est re-moi.

    Encore une question:
    j'ai utilisé un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const float PI = 3.141592653589793;
    et j'obtiens un :
    • warning C4305: 'initializing' : truncation from 'const double' to 'const float'

    a la compilation

    pour moi c'est pas logique

    si PI est defini comme float, ca valeur correspond a un float (enfin il me semble), que vient faire le double dans le warning ?

  14. #14
    Membre du Club
    Inscrit en
    Février 2003
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 130
    Points : 66
    Points
    66
    Par défaut
    bon j'ai encore parlé plus vite que mon cerveau

    normale qu'il y ai ce warning, PI est bien un float, mais la valeur etait un double.
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const float PI=3.141592653589793f;
    c'est mieux

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2004
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Je ne voulais pas créer un nouveau sujet inutilement, mais je me demandais tout simplement:

    En C++ c'est mal vu d'utiliser des #define pour définir des constantes et il vaut mieux utiliser const ?

    Et en C on garde la bonne vieille habitude d'utiliser les #define pour les constantes puisqu'il n'y a pas d'autres choix ?

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 374
    Points : 41 541
    Points
    41 541
    Par défaut
    Disons qu'en C, si on a du temps à dépenser, on peut toujours inclure un transtypage dans les définitions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define FLAG_0 ((unsigned short)0x0001)
    #define FLAG_1 ((unsigned short)0x0002)
     
    #define PI ((float)3.141592653589793)//enfin, pour celui-ci, mettre un 'f' suffit peut-être...
    Inconvénients :
    Ne peut pas être comparé directement avec un #if
    Ne marche pas avec les "enum" qui n'ont pas de type à part "entier".[/code]
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [C++]closure + héritage + transtypage
    Par JEG dans le forum C++Builder
    Réponses: 11
    Dernier message: 30/01/2004, 14h26
  2. USER DEFINE FONCTION : PB éxécution requête
    Par juelo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2004, 11h12
  3. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45
  4. define avec GCC.
    Par vagabon dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/06/2003, 14h04
  5. [transtypage]PChar et WideString
    Par rbag dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/09/2002, 20h12

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