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 :

problème avec mes constantes


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 285
    Points : 884
    Points
    884
    Par défaut problème avec mes constantes
    Bonjour, j'ai encore un pb avec mes #define. Voici mon code :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include<stdlib.h>
    #include<stdio.h>
    #include<assert.h>
     
    #ifndef MSG_ERROR
    #define MSG_ERROR fprintf(stderr,"Error in file %s in function %s at line %u:\n",__FILE__,__FUNCTION__,__LINE__)
    #else
    #error Constant MSG_ERROR is already defined. End of compilation
    #endif
     
    #ifndef EXIT_PRGM
    #define EXIT_PRGM exit(EXIT_FAILURE)
    #else
    #error Constant EXIT_PRGM is already defined. End of compilation
    #endif
     
    #ifndef ERROR_ALLOC_MEM
    #define ERROR_ALLOC_MEM MSG_ERROR;fprintf(stderr,"Error allocation memory\nExit program\n");exit(EXIT_FAILURE)
    #else
    #error Constant ERROR_ALLOC_MEM is already defined. End of compilation
    #endif
     
     
     
    int main()
    {
     
      double * p=malloc(3*sizeof(*p));
      //if(p==NULL) ERROR_ALLOC_MEM;
      assert(p!=NULL);
     
      p[0]=1; p[1]=2; p[2]=3;
      printf("%f\t%f\t%f\n",p[0],p[1],p[2]);
      return(EXIT_SUCCESS);
    }
    ici la sortie est correcte :
    1.000000 2.000000 3.000000
    en revanche si mon main devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
     {
     
       double * p=malloc(3*sizeof(*p));
       if(p==NULL) ERROR_ALLOC_MEM;
       //assert(p!=NULL);
     
       p[0]=1; p[1]=2; p[2]=3;
       printf("%f\t%f\t%f\n",p[0],p[1],p[2]);
       return(EXIT_SUCCESS);
     }
    j'obtiens la sortie :

    Error in file cste.c in function main at line 30:
    Error allocation memory
    Exit program
    savez-vous pourquoi ?
    Merci

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Voilà pourquoi ne pas cacher du code dans des macros...

    Il faudrait mettre des {} autour de ta macro dans ton main...

    Mais je te déconseille cette pratique...

    Jc

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 285
    Points : 884
    Points
    884
    Par défaut
    OK d'accord, j'ai changé mon main en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
    {
     
      double * p=malloc(3*sizeof(*p));
      if(p==NULL) {ERROR_ALLOC_MEM;}
      //assert(p!=NULL);
     
      p[0]=1; p[1]=2; p[2]=3;
      printf("%f\t%f\t%f\n",p[0],p[1],p[2]);
      return(EXIT_SUCCESS);
    }
    c'est vrai que c'est vraiment laid !
    mais pourquoi les accolades ?
    Je prends ton conseil : pas de code dans mes macros !

  4. #4
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par salseropom
    mais pourquoi les accolades ?
    Remplaces la macro qui se trouve dans le main par son contenu et tu auras la réponse...
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : juin 2004
    Messages : 5 840
    Points : 11 616
    Points
    11 616
    Par défaut
    Citation Envoyé par salseropom
    mais pourquoi les accolades ?
    Parce qu'une fois le préprocesseur passé tu obtiens (avec l'indentation correcte) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if(p==NULL)
        fprintf(stderr,"Error in file %s in function %s at line %u:\n",__FILE__,__FUNCTION__,__LINE__);
      fprintf(stderr,"Error allocation memory\nExit program\n");
      exit(EXIT_FAILURE);
    Alors que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      if(p==NULL)
      {
        fprintf(stderr,"Error in file %s in function %s at line %u:\n",__FILE__,__FUNCTION__,__LINE__);
        fprintf(stderr,"Error allocation memory\nExit program\n");
        exit(EXIT_FAILURE);
      }
    Pour éviter les accolades dans le code, tu peux aussi définir la macro ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define ERROR_ALLOC_MEM do \
    { \
        MSG_ERROR; \
        fprintf(stderr,"Error allocation memory\nExit program\n"); \
        exit(EXIT_FAILURE); \
    } while (0)

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : décembre 2003
    Messages : 14 512
    Points : 20 979
    Points
    20 979
    Par défaut
    Citation Envoyé par salseropom
    Bonjour, j'ai encore un pb avec mes #define. Voici mon code :
    savez-vous pourquoi ?
    Ben oui.
    • Regle #1 Pas de source qui dépasse 80 colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef ERROR_ALLOC_MEM
    #define ERROR_ALLOC_MEM\
    MSG_ERROR;\
    fprintf(stderr,"Error allocation memory\nExit program\n");\
    exit(EXIT_FAILURE)
    #else
    #error Constant ERROR_ALLOC_MEM is already defined. End of compilation
    #endif
    • Regle #2 Si tu mets du code dans une macro, il doit être monolithique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef ERROR_ALLOC_MEM
    #define ERROR_ALLOC_MEM\
    do
    {
       MSG_ERROR;\
        fprintf(stderr,"Error allocation memory\nExit program\n");\
       exit(EXIT_FAILURE)\
    }\
    while (0)
    #else
    #error Constant ERROR_ALLOC_MEM is already defined. End of compilation
    #endif
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    décembre 2004
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2004
    Messages : 1 285
    Points : 884
    Points
    884
    Par défaut
    ah ah très mâlin ! merci de vos réponses !

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

Discussions similaires

  1. Un bien étrange problème avec mes namespaces
    Par zarbiman dans le forum C#
    Réponses: 5
    Dernier message: 03/03/2007, 19h59
  2. [FreeBSD] Problème avec mes disques durs
    Par gorgonite dans le forum BSD
    Réponses: 24
    Dernier message: 29/06/2006, 18h03
  3. [JDBC]problème avec mes id
    Par Hydre dans le forum JDBC
    Réponses: 12
    Dernier message: 29/09/2005, 14h19
  4. [std::list][find_if] problème avec mes foncteurs
    Par n!co dans le forum SL & STL
    Réponses: 12
    Dernier message: 04/02/2005, 12h56
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 16h16

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