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

Langage C++ Discussion :

méthode versus #define


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut méthode versus #define
    Bonsoir à toutes et à tous,

    Quels sont les avantages/inconvénients relatifs de ces deux manières d'obtenir un résultat (le code n'est ici qu'un exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(deg,min,sec) (deg) >= 0 ? ((float)(deg)+(float)(min)*0.0166666667+(float)(sec)*0.0002777778) : ((float)(deg)-(float)(min)*0.0166666667-(float)(sec)*0.0002777778)
     
    float dmsTOdd(float deg, float min, float sec) {
      return (deg) >= 0 ? ((float)(deg) + (float)(min) * 0.0166666667 + (float)(sec) * 0.0002777778) : ((float)(deg) - (float)(min) * 0.0166666667 - (float)(sec) * 0.0002777778);
    }
    Merci pour vos renseignements.

    Pierre

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Partons de ton exemple :
    combien vaut : 180+DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(10,0,0) ? réponse 10.0 !!
    combien vaut : int dg=90; DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(++dg,0,0) ? réponse 92 !!

    Si on ajoute inline avant la fonction : inline float dmsTOdd(float deg, float min, float sec) elle sera implémentée avec un compacité au moins équivalente à la macro.

    Donc avantage à la macro pour un traitement du type fonction : NEANT

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    J'avoue n'avoir strictement rien compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    combien vaut : 180+DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(10,0,0) ? réponse 10.0 !!
    veut donc dire qu'on ne peut pas ajouter une macro et un nombre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    combien vaut : int dg=90; DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(++dg,0,0) ? réponse 92 !!
    Ici, cela veut dire que dg est incrémenté deux fois ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si on ajoute inline avant la fonction : inline float dmsTOdd(float deg, float min, float sec) elle sera implémentée avec un compacité au moins équivalente à la macro.
    Je te crois.

    Mais de là en tirer la conclusion que tu fais, alors là, je suis complètement perdu.

    Cordialement.

    Pierre

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Une macro c'est en fait un remplacement d'un texte, ça peut avoir des effets indésirables.
    180+DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(10,0,0) devient en remplaçant
    180+(10) >= 0 ? ((float)(10)+(float)(0)*0.0166666667+(float)(0)*0.0002777778) : ((float)(10)-(float)(0)*0.0166666667-(float)(0)*0.0002777778), donc le 180 s'ajoute ici au test. La syntaxe est trompeuse!
    int dg=90; DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(++dg,0,0) devient 180+(++dg) >= 0 ? ((float)(++dg)+(float)(0)*0.0166666667+(float)(0)*0.0002777778) : ((float)(++dg)-(float)(0)*0.0166666667-(float)(0)*0.0002777778).
    Les macros présentent donc un piège. Les fonctions inline ont la capacité de mieux vérifier les types et d'éviter ces effets de bord.
    Autrefois c'était un moyen d'optimiser du code, depuis il y a les fonctions inline et les template qui sont capable de faire au moins aussi bien et plus surement.

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Ah, et bien là, je comprends beaucoup mieux. Merci "dalfab".

    Cordialement.

    Pierre

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    Et ouais, tu as fais l'erreur de ne pas surparenthèser ta macro : c'est direct la baffe/ le point qui tue


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(deg,min,sec) ((deg >= 0)? ((float)(deg)+(float)(min)*0.0166666667+(float)(sec)*0.0002777778): ((float)(deg)-(float)(min)*0.0166666667-(float)(sec)*0.0002777778))
    Et ensuite tu as eu la deuxième réponse classique anti-macro : Comme tu es bête, il faut que tu fasses attention parce que ta macro tu peux la mettre partout/ l'utiliser à mauvais escient. Et même le compilateur ni peut rien.

    Donc plus une macro de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define DEGREES_MINUTES_SECONDS_TO_DECIMAL_DEGREES(deg, min, sec, result) \
        if ((deg >= 0) { \
            result = ((float) (deg) + (float) (min) * 0.0166666667 + (float) (sec) * 0.0002777778); \
        } else { \
            result = ((float) (deg) - (float) (min) * 0.0166666667 - (float) (sec) * 0.0002777778); \
        }

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

Discussions similaires

  1. C# versus Java
    Par laffreuxthomas dans le forum C#
    Réponses: 368
    Dernier message: 30/03/2019, 22h59
  2. Erreur "Application Defined" avec la méthode CopyFromRecordset
    Par Milyshyn76 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/11/2016, 11h41
  3. Procédural dans l'objet (méthodes versus fonctions)
    Par Jimalexp dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 23/01/2009, 14h32
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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