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 :

empecher la compilation de façon conditionnelle


Sujet :

C

  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut empecher la compilation de façon conditionnelle
    Bonjour.

    Dans mon code, j'ai 2 typedef enum. un contient X éléments, et le second X+1.
    Exempl:
    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
     
    typedef enum
    {
        toto1=0,
        toto2,
        toto3,
        num_toto
    }Ttoto;
     
    typedef enum
    {
        tata1=0,
        tata2,
        tata3,
        tata4,
        num_tata
    }Ttata;
    Et tenez-vous bien, il FAUT que le deuxième contienne exactement 1 élément de plus que le premier. Sinon, ça va compiler, ça va s'executer, mais pas correctement!

    Ce que je voudrais, c'est que si un jour quelqu'un s'amuse à rajouter un toto4, ça ne compile plus si il oublie de rajouter un tata5!

    un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #if ( num_tata != (num_toto +1) )
    #error Ttata should contain 1 element more than Ttoto
    #endif
    le problème c'est que num_tata et num_toto ne sont pas connu à la pré-compilation!

    Existe-t'il un moyen simple et efficace de faire ça?
    merci

    Biosox

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Mettre un commentaire de façon à l'expliciter ?

    Le contrôler à l'execution et bloquer le déroulement du programme si la condition n'est pas remplie ?

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void RevoyezVotreCopie(struct { char x[(num_tata == num_toto+1)*2-1];});

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    SUPERBE!

    j'y avais pas pensé. C'est tout simplement génial!

    Mais euh... questions:
    ça ne suffirait pas de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void RevoyezVotreCopie(char x[(num_tata == num_toto+1)*2-1]);
    on vire le "struct".
    A moins qu'une subtilité m'échappe?

    merci

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Ce que je voudrais, c'est que si un jour quelqu'un s'amuse à rajouter un toto4, ça ne compile plus si il oublie de rajouter un tata5!
    Il faudrait que tu aies des notions avancées d'algorithmie.
    On peut faire ça de manière + souple avec des listes chainées plutot que ce genre de bricolage...

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par mat.M
    Il faudrait que tu aies des notions avancées d'algorithmie.
    On peut faire ça de manière + souple avec des listes chainées plutot que ce genre de bricolage...
    A quoi tu penses? On sait juste qu'il faut que deux enums soient synchronises, sans savoir d'ou ils viennent. Je ne vois pas un probleme d'algorithmique la-dedans, je ne vois pas en quoi des listes chainees pourraient intervenir. Il y a peut-etre une meilleure maniere d'organiser le code, mais on ne connait pas assez le contexte pour proposer quelque chose.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Biosox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void RevoyezVotreCopie(char x[(num_tata == num_toto+1)*2-1]);
    on vire le "struct".
    A moins qu'une subtilité m'échappe?
    Possible. J'aime pas trop les tailles dans les prototypes, ca ne signifie rien et je n'ai pas le temps de verifier les contraintes qu'il y a dessus.

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    A quoi tu penses? On sait juste qu'il faut que deux enums soient synchronises, sans savoir d'ou ils viennent.
    Je ne pense à rien simplement j'ai l'impression que c'est un peu du bricolage..
    cela saute aux yeux
    La personne qui expose son problème parle d'allouer et réallouer dynamiquement des entités...ce qui se fait avec des listes chainées non ?


    1 :
    empecher la compilation de façon conditionnelle
    Non sens : la compilation conditionnelle c'est au concepteur de la définir pas de l'empêcher ! ( avec des #ifndef...)
    2: un enum chez moi cela remplace plusieurs #define ; un enum chez moi c'est fait pour être établi une bonne fois pour toutes pas être bricolé

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par mat.M
    Je ne pense à rien simplement j'ai l'impression que c'est un peu du bricolage..
    cela saute aux yeux
    La personne qui expose son problème parle d'allouer et réallouer dynamiquement des entités...ce qui se fait avec des listes chainées non ?
    J'ai beau relire le premier message, je ne vois aucune mention d'allocation dynamique. Et le message n'a pas ete edite.

    Au fait, les allocations dynamiques ne se font pas avec des listes chainees et de toute maniere on se fout generalement de l'implementation de l'allocateur.

    1 :
    Non sens : la compilation conditionnelle c'est au concepteur de la définir pas de l'empêcher ! ( avec des #ifndef...)
    Il a une contrainte a faire respecter. Il veut la verifier de facon statique, ca me semble quelque chose de bon sens.

    2: un enum chez moi cela remplace plusieurs #define ; un enum chez moi c'est fait pour être établi une bonne fois pour toutes pas être bricolé
    Oui, il y a une part de bricolage. Malheureusement, il y a souvent une part de bricolage quand on tient compte des contraintes exterieures et qu'on ne batit pas un programme a partir de rien, sans utiliser de bibliotheque externe, sans devoir etre compatible avec un historique de 15 ans. Ce genre de contraintes -- deux enums plus ou moins synchronises -- apparaissent alors. Empecher la compilation si elles ne sont pas respectees est le mieux qu'on puisse faire. Ensuite vient la verification a l'execution. Enfin le commentaire...

  10. #10
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    Citation Envoyé par mat.M
    La personne qui expose son problème parle d'allouer et réallouer dynamiquement des entités...ce qui se fait avec des listes chainées non ?
    effectivement ça se fait avec des listes chaînées. Mais je ne parle pas d'allouer ou de réallouer dynamiquement la mémoire.
    Citation Envoyé par mat.M
    Non sens : la compilation conditionnelle c'est au concepteur de la définir (...)
    un enum chez moi c'est fait pour être établi une bonne fois pour toutes pas être bricolé
    Alors tu as bien de la chance. Parce que dans ma vie professionnelle, j'ai encore jamais vu un code qui soit le fruit du labeur d'UN seul type. (ni un programme complet, dont le premier codeur, 3 ans en arrière, avait déja pensé à tout et donc fait un enum "complet" qui n'a plus besoin d'être modifié)

    Enfin, je SAIS que quelqu'un reprendra un jour mon code, et si il le lit en diagonale (ce qu'il va faire) je "sens" que c'est l'erreur qu'il risque de commettre.

    La il va compiler, ça va échouer, il va regarder pourquoi, et il y aura une petite explication en commentaire juste au dessus de cette ligne.

    Si j'écris de la doc, il va pas la lire (pas le temps de la lire, pas le temps de l'ecrire).

    Je suis le premier a trouver ça dommage, et a vouloir écrire du code plus beau. Mais le client il veut pas que le code soit beau, il veut qu'il soit livré hier. C'est comme ça

    Bref, merci à Jean-Marc.Bourget pour ce bricolage. je met ce post "résolu"

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/06/2013, 17h58
  2. Erreur empechant la compilation de mon projet silverlight 4
    Par maxwel56 dans le forum Silverlight
    Réponses: 4
    Dernier message: 20/01/2010, 17h44
  3. Probleme d'accent qui empeche la compilation
    Par Balbuzard dans le forum Débuter
    Réponses: 13
    Dernier message: 09/05/2009, 15h39
  4. [CR XI] Masquer un champ de façon conditionnelle
    Par barbarian9 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/03/2008, 11h30
  5. [CODE] Compilation conditionnelle ?
    Par Cornell dans le forum Langage
    Réponses: 3
    Dernier message: 16/09/2003, 19h16

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