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 :

Comment bien définir une constante +INFINI en c++


Sujet :

C++

  1. #1
    Membre éclairé Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Par défaut Comment bien définir une constante +INFINI en c++
    Bonjour tout le monde,

    Je cherche à savoir comment je peux définir une constante +infini en C++.

    J'ai trouvé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const long INFINI = 10000000;
    ou bien passer par le #define
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define INFINI=10000000
    Ma question est quelle est la meilleure solution?
    Si c'est const long INFINI=... ou dois-je le mettre? dans le main? dans une classe "poubelle"? dans la classe qui en aura le plus besoin?

    Merci de vos éclaircissements.

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    http://www.cplusplus.com/reference/s...umeric_limits/

    Pour les entiers:
    std::numeric_limits<T>::max()

    Pour les réels
    std::numeric_limits<T>::infinity()

  3. #3
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    L'utilisation des fonctions de std::numeric_limits n'empêche pas la définition d'une constante ; tout dépend de ce que l'on veut faire.
    En plus, ça peut éviter d'appeler lesdites fonctions plusieurs fois.
    Bon ok, c'est de la micro-optimisation, et on risque de ne pas gagner grand chose...

    Citation Envoyé par touftouf57 Voir le message
    Ma question est quelle est la meilleure solution?
    Pour cette question, je ne suis pas un expert, mais je ne pense pas que ça a une grande importance.
    C'est encore un problème de micro-optimisation, et encore...
    D'un point de vue conceptuel, du moment que le tout reste cohérent, je pense qu'il n'y a pas de souci (à confirmer).

    Citation Envoyé par touftouf57 Voir le message
    Si c'est const long INFINI=... ou dois-je le mettre? dans le main? dans une classe "poubelle"? dans la classe qui en aura le plus besoin?
    A priori, je dirais dans un header, inclus partout où tu en as besoin...
    Mais faire un fichier juste pour une définition...
    Tu peux regrouper plusieurs définitions globales dans un même fichier, du moment qu'elles n'ont pas trop de dépendances.

    Sinon, à bien y réfléchir, l'endroit le plus approprié pour une déclaration globale me semble être le fichier principal.
    Et dans ce cas, ta constante doit être déclarée avec le mot-clé « extern » dans les autres unités de compilation.

    Si je ne m'abuse, il y a la macro « RAND_MAX », définie dans le header math.h (en C), qui donne le plus grand entier (int) codable.

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    numeric_limits renvoit une constante, le compilo fera la CSE tout seul.

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par Joel F Voir le message
    le compilo fera la CSE tout seul.
    La quoi

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    +1 Joel

    Une variable globale en C++ devrais être à proscrire, tout comme les macros, encore utiliser car il subsiste un héritage culturel du C mais c'est pas forcement bon en C++...

    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
     
     
    //Pour tous
    template<class T>
    struct LIMITS
    {
    public:
         static const T INFINI;
    };
    template< class T>
    const T LIMITS<T>::INFINI = std::numeric_limits<T>::infinity();
     
     
    int main()
    {
        // LIMITS<long>::INFINI
    }
    Tu appels une fois la fonction, tu l'encapsules, tu utilises le standard! Quoi de plus beau? :p

  7. #7
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    La quoi
    Common Subexpression Elimination.
    Y a plus de cours de compil de nos jours ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    En 16 bits ou en 32 bits la valeur la plus grande pour un long est
    2 147 483 647 la plus petite -2 147 483 648
    Moi, j'utilise MAXLONG défini dans <values.h>

  9. #9
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Une variable globale en C++ devrais être à proscrire, tout comme les macros
    Je vois...

    Citation Envoyé par Joel F Voir le message
    Y a plus de cours de compil de nos jours ?
    Si si, j'en ai eu.
    Quoi que ce n'était pas « compilation » l'intitulé du cours...
    Enfin, du « cours »...

  10. #10
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    numeric_limits<unsigned int>::max();
    numeric_limits<long double>::max();

    Ainsi tu auras les valeurs maximales pour ta constante INFINITY.

    Il faut procrire les constantes globales sauf si ta constante concerne l'ensemble de ton programme mais attention danger ! Mets ta constante dans la classe qui l'utilise. Il faut choisir "const" plutôt "#define".

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Mets ta constante dans la classe qui l'utilise. Il faut choisir "const" plutôt "#define".
    Les auteurs du langage ont préféré #define
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define LONG_MAX        2147483647L     /* maximum signed   long value */

  12. #12
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    pour des raisons historiques, vu que ce truc reprend uninclude C.

    static const à l'avantage de typé la constante et de ne pas polluer l'espace des symboles.

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    Les auteurs du langage ont préféré #define
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define LONG_MAX        2147483647L     /* maximum signed   long value */
    du langage C!!

  14. #14
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut
    Je réponds quitte à faire remonter ce vieux fil car (la preuve par l'expérience) il fait partie des réponses que Google propose quand on cherche

    Voici une solution propre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        #include <limits>
        typedef double D ; // ou ce que vous voulez tester
        if (! std::numeric_limits<D>::has_infinity)
        {
            std::cerr << "pas d'infini pour cette classe.\n" ;
            throw ;
        }
        D mon_infini = std::numeric_limits<D>::infinity() ;

  15. #15
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bof pour le typedef. Il manque un const. Et je vois pas l'intérêt de définir une variable (globale probablement en prime)

  16. #16
    Membre émérite
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Billets dans le blog
    1
    Par défaut
    L'idée était simplement de pointer l'existence d'une définition standard de l'infini dans la STL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::numeric_limits<D>::infinity()

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/01/2008, 19h13
  2. définir une constante en Perl
    Par djidane39 dans le forum Langage
    Réponses: 1
    Dernier message: 14/11/2007, 14h22
  3. relation avec le client - comment bien concevoir une appli
    Par ver_for dans le forum Modélisation
    Réponses: 2
    Dernier message: 08/05/2007, 12h35
  4. Réponses: 7
    Dernier message: 06/05/2006, 15h24
  5. [Secu] comment bien sécuriser une application
    Par orelero dans le forum Général Java
    Réponses: 4
    Dernier message: 26/04/2006, 12h50

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