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 :

retour de valeur #define


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Par défaut retour de valeur #define
    Bonjour tous le monde

    quelqu'un sait il comment dans :

    je peut récupérer 'valeur' et pas 1 ?

    merci d'avance

  2. #2
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Bonjour,

    Qu'est ce que tu veux dire par récupérer ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Par défaut
    avec un printf par exemple, je voudrais que soit affiché "valeur" en toutes lettres et pas 1

  4. #4
    Membre chevronné
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Par défaut
    Eh bien… non, c'est tout à fait impossible !
    Pour que tu comprennes bien pourquoi, il faut que tu imagines que le préprocesseur (le programme appelé avant la compilation et qui s'occupe, entre autres, des #define) agit ni plus ni moins comme la fonction rechercher/remplacer de ton éditeur de texte. Si bien que la chaîne « valeur » n'existe plus lorsque la compilation commence.

    Que cherches-tu à faire, exactement ?
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Par défaut
    pour mon programme ; rien en particulier avec "valeur";

    je passe par les #define pour plus de lisibilité dans le prog et je voulais pouvoir afficher "valeur" a l'écran pendant l'exécution à titre d'information.

    si on peut pas, je le ferais pas

    merci pour la réponse

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    De manière générale, les #define sont très largement déconseillés en C++, du simple fait du fonctionnement même du préprocesseur.

    Si tu souhaite disposer de valeur explicites, envisage peut-être de te tourner vers des énumérations, voire vers des valeurs statiques constantes, bien que cette dernière solution ne soit pas *forcément* bien meilleure que le recours à #define.

    les avantages de l'énumération, sont:
    • que tu dispose, en plus de la possibiliité de regrouper l'ensemble des valeurs "qui vont bien ensemble":
    • que tu dispose d'une vérification du type (tu ne peux pas utiliser un identifiant qui ne fasse pas partie de l'énumération, si tu a déclaré une variable du type de celle-ci)

    En effet, imaginons le cas "classique" des define, dans lequel j'ai intentionnellement glissé quelques erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define Good         1
    #define Bad          0
    #define FileOpen     0
    #define FileNotOpen  1
    #define fileRead     2
    #define FileWrite    4
    #define FileBinary   8
    #define FileText    16
    #define NoError      1
    #define ErrorOccured 0
    Au cas où tu ne l'aurais pas remarqué, j'ai "simplement" inversé la valeur de FileOpen et de FileNotOpen.

    En effet, en terme de valeur, FileNotOpen correspondrait bien plus à un état d'erreur, et donc à Bad ou à ErrorOccured, et, inversément, FileOpen correspondrait bien plus à un état sans erreur, et donc à Good ou à NoError.

    Or, le préprocesseur est un "brave petit soldat qui obéit sans poser de question", et, lorsqu'il va faire son job, il va donc remplacer FileOpen par... 0 et FileNotOpen par... 1.

    Au final, quand le compilateur rencontrera un test du genre de if(valeur == FileOpen), il réagira exactement de la même manière que s'il avait rencontré un test du genre de if(valeur == Bad) ou de if(valeur == ErrorOccured), ce qui ne correspond pas à la réalité "sémantique" du problème

    Mais les problèmes ne s'arrêtent pas là.

    Tu l'aura compris, tous les define File* ont trait... à la gestion de fichiers.

    Comme pour le préprocesseur, les "tokens" définis ne sont finalement que des valeurs, il ne se rend absolument pas compte du fait qu'ils pourraient être groupés par deux, ni qu'ils font partie d'un ensemble "complet".

    Alors que, si tu travailles avec une énumération proche de (dans un autre contexte, car celui de la gestion d'un état de fichier ne correspond pas à la démonstration que je veux faire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum eMyEnum
    {
        meBrol,
        meTruc,
        meChose,
        meBidule,
        meMachin
    };
    si, déjà, tu déclare une variable de type eMyEnum, tu ne pourra déjà pas lui donner une autre valeur que meBrol, meTruc, meChose, meBidule ou meMachin.

    Mais, de plus, si tu en viens à envisager un test à choix multiple sous la forme de
    enum eMyEnum e;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch (e)
    {
        case meBrol:
            doSomething();
            break;
         case meTruc:
            doSomethingElse();
            break;
        /* tu n'a pas pensé à  meChose, meBidule ou meMachin. et tu
         * n'a pas prévu de cas par défaut
         */
    }
    le compilateur - pour autant qu'il soit bien réglé - t'enverra un avertissement pour chaque valeur que tu n'aurais pas pris en compte dans ton switch.

    Au final, tu te rend compte que tu n'a que des avantages à utiliser une énumération
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [TSQL]retour de valeur avec execute
    Par zoltix dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/09/2006, 15h13
  2. Erreur retour de valeur !!
    Par mana12 dans le forum C++
    Réponses: 1
    Dernier message: 24/06/2006, 12h12
  3. [VB.NET] Retour de valeur
    Par krfa1 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/05/2006, 09h32
  4. PB de retour de valeur dans formulaire
    Par Poutchou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 05/04/2006, 16h10
  5. retour de valeur
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/09/2005, 16h20

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