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 :

Déclaration complexe de MACRO #define


Sujet :

C

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Déclaration complexe de MACRO #define
    Bonsoir

    La structure de l'ensemble de macro suivantes me bloque:
    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
    22
     
    #define FSI_DECL Fsi *fsi; int _k,_n,_k1,_i; LWFLOAT _f; char _flagBreak=NO
     
     
    #define FSI_FOR_START1(list) { \
      for (_k=0,_n=0;_n<list->size && !_flagBreak;_n++) { \
        fsi = &(list->fsi[_n])
    #define FSI_FOR_START2(list) \
        for (_k1=0;_k1<fsi->size && !_flagBreak;_k1++) { \
          _f = FSIArray(fsi,_k1); \
          _i= (int) _f
    #define FSI_FOR_START(list) \
      FSI_FOR_START1(list); \
      FSI_FOR_START2(list)
     
    #define FSI_BREAK _flagBreak=YES; continue
     
    #define FSI_FOR_END2 _k++;}
    #define FSI_FOR_END1 }}
    #define FSI_FOR_END \
      FSI_FOR_END2; \
      FSI_FOR_END1
    Comment le programme lit ce code? J'ai l'impression que c'est une boucle.
    Ou est la fin, et le début? C'est l'imbrication des macros qui je ne comprends pas. On dirait que c'est décalé.


    Je n'ai jamais vu qqch comme cela en C++. Est propre au C?
    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Hello,

    Il n'y a pas d'imbrication. Chaque fois que tu vois un contre-slash « \ » seul à la toute fin d'une ligne (c'est-à-dire même pas suivi de blancs tels qu'espaces ou tabulations), c'est qu'il s'agit d'une seule et unique expression qui se poursuit sur la ligne suivante car elle est trop longue pour être écrite en entier sur une ligne seule.

    Apparement, les accolades ouvertes ne sont pas refermées (et réciproquement) au sein d'une même macro, précisément parce que ces macros sont définies par paire, pour pouvoir mettre du code entre les deux.

    C'est légal, mais pas très propre.

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    J'ai l'impression que les accolades se ferment à la fin:
    #define FSI_FOR_END2 _k++;}
    #define FSI_FOR_END1 }}

    Le problème, c'est que les fonctions FSI_FOR_START1 et FSI_FOR_START2
    sont définies, puis appelées dans ces mêmes fonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define FSI_FOR_START1(list) { \
      for (_k=0,_n=0;_n<list->size && !_flagBreak;_n++) { \
        fsi = &(list->fsi[_n])
    #define FSI_FOR_START2(list) \
        for (_k1=0;_k1<fsi->size && !_flagBreak;_k1++) { \
          _f = FSIArray(fsi,_k1); \
          _i= (int) _f
    #define FSI_FOR_START(list) \
      FSI_FOR_START1(list); \
      FSI_FOR_START2(list)
    Cela s'arrête lorsque _flagBreak est à YES (ou à NO). Mais je ne vois pas comment flagBreak peut passer à YES (ou à NO). Il n'y a rien de tel dans ce code.

    merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par deubelte Voir le message
    J'ai l'impression que les accolades se ferment à la fin:
    #define FSI_FOR_END2 _k++;}
    #define FSI_FOR_END1 }}
    C'est ce que je t'explique au-dessus. Une macro FSI_FOR_START est faite pour correspondre à une macro FSI_FOR_END.

    Le problème, c'est que les fonctions FSI_FOR_START1 et FSI_FOR_START2 sont définies, puis appelées dans ces mêmes fonctions.
    Non, ce n'est pas le cas. Relis bien mon précédent commentaire. L'anti-slash seul en fin de ligne sert à prolonger une ligne. Et tu verras qu'il disparaît avant chaque nouvelle macro. C'est plus clair si tu aères un peu les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #define FSI_FOR_START1(list) { \
      for (_k=0,_n=0;_n<list->size && !_flagBreak;_n++) { \
        fsi = &(list->fsi[_n])
     
     
    #define FSI_FOR_START2(list) \
        for (_k1=0;_k1<fsi->size && !_flagBreak;_k1++) { \
          _f = FSIArray(fsi,_k1); \
          _i= (int) _f
     
     
    #define FSI_FOR_START(list) \
      FSI_FOR_START1(list); \
      FSI_FOR_START2(list)

    Tu vois bien qu'elles ne sont pas imbriquées.

    Cela s'arrête lorsque _flagBreak est à YES (ou à NO). Mais je ne vois pas comment flagBreak peut passer à YES (ou à NO). Il n'y a rien de tel dans ce code.
    C'est précisément le code que tu intercales entre les deux macros qui agira sur ce flag s'il veut sortir. Il est aussi possible qu'il y ait encore d'autres macros, un peu plus loin, qui servent à cela.

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

Discussions similaires

  1. [XL-2013] Formule complexe ou macro ?
    Par Yoyodu06 dans le forum Excel
    Réponses: 4
    Dernier message: 18/04/2014, 21h56
  2. problème macro #define
    Par Stobbyo dans le forum Débuter
    Réponses: 3
    Dernier message: 09/03/2011, 09h28
  3. Graphique complexe et macro
    Par apolo1 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 09/11/2009, 21h15
  4. [débutant][macros] préscisions sur #define
    Par Spartan03 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2006, 17h44
  5. Réponses: 4
    Dernier message: 05/02/2006, 16h29

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