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 :

récupérer le token d'un #define par sa value


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut récupérer le token d'un #define par sa value
    Bonjour, voilà je me présente (c'est mon premier post) je suis étudiant et actuellement en stage dans une boite d'informatique à l'étranger et dans un programme que je debug je voudrais récupérer le token d'un #define par sa value. Je m'explique. J'ai deux fichiers un cpp et un .h
    Dans mon .h j'ai pleins de #define token [value], dans mon .cpp il reconnait bien si je lui demande token il me dit [value] jusqu'à la tout va bien
    mais moi ce que je veut c'est lui demander [value] et qu'il me donne token
    et ça je sait pas comment faire...
    Au debut je voulais contourner le problème juste en faisant une lecture du .h et récupérer les info mais le problème et que le programme tournera sur une machine qui ne dispose pas des .h
    Alors j'avais pensé tout simplement à mapper manuellement les info..
    Mais le problème est que si il y a une mise à jour du .h et donc des #define et bien je suis chocolat.. Je vous demande pas une solution toute faite je me doute que vous avez d'autre chose à faire mais j'ai beau chercher sur le forum et sur le net je ne trouve pas de solution à mon problème. Je pense qu'il doit y avoir une fonction du style get.. mais je ne trouve pas. Quelqu'un en sait plus sur ce genre d’opération ?
    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    ce que tu demandes est impossible par défaut.
    Renseignes-toi avant toute chose sur ce qu'est un define (une macro).
    Ca n'a qu'une seule utilité : remplacer la chaîne par sa valeur avant la compilation.
    Et la passe n'est réalisée qu'une seule fois.

    Une façon de faire c'est des macros, mais avec des enums ou variables constantes et non des defines.
    Quelque chose comme ça devrait fonctionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // fichier de définition def.h
    VALUE(blabla, 4);
    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
    18
    19
    20
    21
    #define VALUE(name, value) const long long name = value;
    #include "def.inc"
    #undef VALUE
     
    const char* GetNameByValue(int value)
    {
    #define VALUE(name, value) case value: return #name;
    switch (value) {
    #include "def.h"
      default: return "NOT FOUND";
     }
    #undef VALUE
    }
     
    long long GetByName(const char* szName)
    {
    #define VALUE(name, value) if (strcmp(#name, szName) == 0) return value;
    #include "def.h"
    return -1;
    #undef VALUE
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour Bousk,

    et merci de ta réponse je comprend le fait que se soit impossible par defaut c'est une commande préprocesseur...

    Cependant mon problème et que je ne peut pas changer le .h car dans le temps se .h sera upgradé.
    J'avou que j'ai pas d'idée mes connaissances en C++ sont encore assez faible.

  4. #4
    Invité
    Invité(e)
    Par défaut
    si tu peux pas toucher au .h, tu peux quand meme les parser.

    donc si c'est pour y acceder depuis le cpp, t'as qu'a ouvrir le .h et parser les #define

    Sinon tu peux aussi dire pourquoi t'as besoin de recuperer le nom a partir de la valeur, parce que c'est ca sent pas mal.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Le fait que le .h soit upgradé est une fausse excuse.
    Une fois la syntaxe mise en place, il suffit de l'utiliser.

    Sinon ils changent d'idée, parce qu'en plus d'être totalement anormale, ils ne veulent pas la rendre réalisable.

    Dans l'absolu vouloir retrouver un nom à partir d'une valeur, à fortiori de macros, est, amha, indicateur de problème, voire de méconnaissance de mécanismes et/ou mauvaise utilisation des macros.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci de vos réponses,

    c'est vrai que j'ai pas expliqué le programme, en fait c'est un MQWrapper. En gros la partie dont je m'occupe retourne un code en fonction des errreurs qu'il y a dans la command argument, l'ensemble de code qu'il peut retourner est défini dans un .h fourni par IBM (donc évolutif dans le temps)
    Le programme fonctionne correctement et pour chaque erreur il me retourne le bon code associé. Mais pour plus de clarté je voudrai afficher le nom de l'erreur. Ce nom est disponnible dans le .h d'IBM par les
    #define NOM_ERREUR 4
    Donc si j'ai compris c'est qu'initialement le code retourne NOM_ERREUR et que par l'emploi des #define du .h le code retourne 4.

    Je sais que c'est un peu confus mais c'est bien la tout le problème.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Donc tu n'as pas la main mise sur le .h, mais le possèdes.

    Donc si j'ai compris c'est qu'initialement le code retourne NOM_ERREUR et que par l'emploi des #define du .h le code retourne 4.
    Non, revois tes bases et ce qu'est une macro. La macro remplacera son nom par sa valeur avant la compilation.

    Ce que je ferais dans ce cas c'est créer un script qui parse le .h et le formate à ma guise, et c'est ce nouveau fichier que j'utiliserai au lieu du header brut d'IBM.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Donc tu n'as pas la main mise sur le .h, mais le possèdes.

    Non, revois tes bases et ce qu'est une macro. La macro remplacera son nom par sa valeur avant la compilation.
    Ah oui oui oui c'est vrai et en plus tu me l'a déjà rappelé.. quand on à pas de tête

    Ce que je ferais dans ce cas c'est créer un script qui parse le .h et le formate à ma guise, et c'est ce nouveau fichier que j'utiliserai au lieu du header brut d'IBM.
    D'accord je vais plancher la dessus merci beaucoup Je reviendrai si j'ai des problèmes et puis si ça marche je posterai le code ça peut interesser quelqu'un

    re merci

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par hiromu Voir le message
    Donc si j'ai compris c'est qu'initialement le code retourne NOM_ERREUR et que par l'emploi des #define du .h le code retourne 4.
    C'est plus brutal que ça : à chaque endroit du code ou "NOM_ERREUR" apparaît, le pré-processeur le remplace par "4" (littéralement) avant compilation. Le lien vers le nom de l'erreur est donc en effet complètement perdu.

    Une solution simple serait de tenir à jour un autre header plus propre qui relie le code d'erreur à son message, mais ça ne t'arrange pas car tu n'as pas envie de te taper la correspondance à chaque upgrade.

    Une solution ici c'est d'écrire un petit programme qui parse le .h et stocke dans un fichier avec un autre format la correspondance, fichier qui lui sera livré (quitte à choisir un format binaire) puisque le .h d'IBM ne le sera pas. Ensuite, ton programme principal relira ce fichier pour retrouver les infos. Si tu peux en plus mettre ça dans ta chaîne de compilation pour que l'upgrade en fonction d'un .h changé se face tout seul, c'est nickel.

    Edit: grillé par bousk.
    Find me on github

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    .

    Edit: grillé par bousk.
    ^^, merci quand même ça m'aide. Et puis vu que je suis assez tête en l'air vaut mieux que j'ai l'info plusieurs fois


    En totu cas merci

    Et maintenant y a plus qu'a !!

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Désolé je sais que c'est pas bien mais tu as du code ici qui fait ce qu'on a dit. Le script en python et le parseur en C++.

    A utiliser comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python parse_error_codes.py errors.h
    Et génère un fichier errors.map parsable avec le code C++ fourni dans le lien.
    Find me on github

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Je tiens à tous vous remerciez pour vos réponse ça m'a bien aidé. Je suis content de voir que le code que j'ai fais ressemble à celui que tu me propose
    Citation Envoyé par jblecanard Voir le message
    Désolé je sais que c'est pas bien mais tu as du code ici qui fait ce qu'on a dit. Le script en python et le parseur en C++.

    A utiliser comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python parse_error_codes.py errors.h
    Et génère un fichier errors.map parsable avec le code C++ fourni dans le lien.


    Cependant en déjeunant avec mon boss et en lui expliquant le nouveau système il m'a dit qu'il n'aimé pas trop cette méthode et qu'il devait y avoir directement une méthode produite par IBM il avait juste oublier de m'en parler...... Donc j'ai plus qu'à trouvé ça et mon problème est résolu... dommage pour le nouveau code mais merci de m'avoir aider au moins j'ai pas tout perdu j'ai appris des trucs et ça c'est top

    Bye

    Edit : je passe le topic en résolu

  13. #13
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par hiromu Voir le message
    il devait y avoir directement une méthode produite par IBM il avait juste oublier de m'en parler......
    C'est probable, je pensais tu avais cherché et pas trouvé.

    Citation Envoyé par hiromu Voir le message
    au moins j'ai pas tout perdu j'ai appris des trucs et ça c'est top
    C'est le principal ! Tu peux marquer ton post comme "Résolu".
    Find me on github

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    C'est probable, je pensais tu avais cherché et pas trouvé.
    J'ai cherché effectivement mais pas trouvé... c'est le comble je developpe un logiciel de recherche... bref

    re merci

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/09/2006, 10h05
  2. [c#] comment récupérer le namespace d'une DLL par réflection?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/07/2006, 13h20
  3. Récupérer le path d'un fichier par formuaire ?
    Par Yekhen dans le forum Langage
    Réponses: 6
    Dernier message: 30/05/2006, 20h22

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