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 lors de la compilation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut problème lors de la compilation
    Bonjour, j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Species * CopySpecies(Species * s_)
    {
      Species * s=CreateSpecies(s_->name,s_->M,s_->T,s_->LT,s_->HT);
      CopyViscosity(s_,s);
      return s;
    }
    où le prototype de la fonction CopyViscosity est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void CopyViscosity(Viscosity *,Viscosity *);
    Pourquoi est-ce que mon compilateur ne m'a pas donné un message d'erreur ? Pire, pourquoi n'y a-t-il pas de bug lors de l'exécution ? Y a-t-il un comportement indéterminé (ce que je pense fort) ?

    Voici mes structures utilisées :

    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
     
    struct structspecies
    {
      char * name; /* name */
      double M;    /* molar mass */
      double T;    /* threshold temperature */
      double * LT; /* 7 low temperature coefficients */
      double * HT; /* 7 high temperature coefficients */
      Atoms * atoms; /* atomic composition (C, H, O, N) of the species */
      Viscosity * visc; /* viscosity data */
    };
     
    typedef struct structspecies Species;
     
    typedef struct
    {
      double pot; /* Lennard-Jones potential parameter (the ratio epsilon_0/k_B)
                     (in K)
    	       */
      double sigma; /* Lennard-Jones collision diameter (in Angstrom) */
      double sigma2; /* sigma*sigma */	       
      double Tc; /* critical temperature (in K) */
      double Pc; /* critical pressure (in atm) */
      double Vc; /* critical volume (in cm^3/(g*mol)) */
      double Zc; /* critical compressibility */
    } Viscosity;
    je compile avec les options d'Emmanuel :

    ED_PARANOIA=-O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int \
    -Werror-implicit-function-declaration -Wmain -Wparentheses \
    -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused \
    -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef \
    -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings \
    -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes \
    -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn \
    -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations \
    -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long \
    -Wunreachable-code
    L'erreur que j'obtenais à la fin de mon programme, lors de la libération de toute la mémoire allouée, était celle-ci :

    out(3093,0xa000d000) malloc: *** Deallocation of a pointer not malloced: 0x3098a0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug
    ce qui se comprend bien vue ma faute de prototype... Mais pourquoi ai-je cette erreur sur mon Mac intel (gcc version 3.0) et pourquoi n'apparait-elle pas sur mon linux Suse pro 9.3 (gcc version 3.0) ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Par défaut
    Le problème vient de la fonction CopyViscosity qui reçoit des Species en paramètre au lieu de Viscosity.

    Il faudrait soit la réécrire pour qu'elle accepte des Species, soit pointer sur le membre Viscosity lors de l'appel:

    CopyViscosity(s_->visc, s->visc) ;

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Zartan Voir le message
    Le problème vient de la fonction CopyViscosity qui reçoit des Species en paramètre au lieu de Viscosity.

    Il faudrait soit la réécrire pour qu'elle accepte des Species, soit pointer sur le membre Viscosity lors de l'appel:

    CopyViscosity(s_->visc, s->visc) ;
    Salut, oui j'avais bien vu que mon erreur était là. Mais pourquoi est-ce que mon compilo ne m'affiche qu'un simple warning et non une erreur ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Bonjour, j'ai le code suivant :
    Il est incomplet :
    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
    37
    38
    39
    40
    41
    42
     
    struct structspecies
    {
      char * name; /* name */
      double M;    /* molar mass */
      double T;    /* threshold temperature */
      double * LT; /* 7 low temperature coefficients */
      double * HT; /* 7 high temperature coefficients */
      Atoms * atoms; /* atomic composition (C, H, O, N) of the species */
      Viscosity * visc; /* viscosity data */
    };
     
    typedef struct structspecies Species;
     
    typedef struct
    {
      double pot; /* Lennard-Jones potential parameter (the ratio epsilon_0/k_B)
                     (in K)
    	       */
      double sigma; /* Lennard-Jones collision diameter (in Angstrom) */
      double sigma2; /* sigma*sigma */
      double Tc; /* critical temperature (in K) */
      double Pc; /* critical pressure (in atm) */
      double Vc; /* critical volume (in cm^3/(g*mol)) */
      double Zc; /* critical compressibility */
    } Viscosity;
     
     
    void CopyViscosity(Viscosity *,Viscosity *);
     
    Species * CopySpecies(Species * s_)
    {
      Species * s=CreateSpecies(s_->name,s_->M,s_->T,s_->LT,s_->HT);
      CopyViscosity(s_,s);
      return s;
    }
     
     
    int main(void)
    {
       return 0;
    }
    produit :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:8: error: syntax error before "Atoms"
    main.c:8: warning: no semicolon at end of struct or union
    main.c:9: warning: type defaults to `int' in declaration of `visc'
    main.c:9: warning: data definition has no type or storage class
    main.c:10: error: syntax error before '}' token
    main.c: In function `CopySpecies':
    main.c:32: warning: implicit declaration of function `CreateSpecies'
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: warning: initialization makes pointer from integer without a cast
    main.c:33: warning: passing arg 1 of `CopyViscosity' from incompatible pointer type
    main.c:33: warning: passing arg 2 of `CopyViscosity' from incompatible pointer type
    Process terminated with status 1 (0 minutes, 0 seconds)
    7 errors, 7 warnings

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Il est incomplet :
    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
    37
    38
    39
    40
    41
    42
     
    struct structspecies
    {
      char * name; /* name */
      double M;    /* molar mass */
      double T;    /* threshold temperature */
      double * LT; /* 7 low temperature coefficients */
      double * HT; /* 7 high temperature coefficients */
      Atoms * atoms; /* atomic composition (C, H, O, N) of the species */
      Viscosity * visc; /* viscosity data */
    };
     
    typedef struct structspecies Species;
     
    typedef struct
    {
      double pot; /* Lennard-Jones potential parameter (the ratio epsilon_0/k_B)
                     (in K)
    	       */
      double sigma; /* Lennard-Jones collision diameter (in Angstrom) */
      double sigma2; /* sigma*sigma */
      double Tc; /* critical temperature (in K) */
      double Pc; /* critical pressure (in atm) */
      double Vc; /* critical volume (in cm^3/(g*mol)) */
      double Zc; /* critical compressibility */
    } Viscosity;
     
     
    void CopyViscosity(Viscosity *,Viscosity *);
     
    Species * CopySpecies(Species * s_)
    {
      Species * s=CreateSpecies(s_->name,s_->M,s_->T,s_->LT,s_->HT);
      CopyViscosity(s_,s);
      return s;
    }
     
     
    int main(void)
    {
       return 0;
    }
    produit :
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:8: error: syntax error before "Atoms"
    main.c:8: warning: no semicolon at end of struct or union
    main.c:9: warning: type defaults to `int' in declaration of `visc'
    main.c:9: warning: data definition has no type or storage class
    main.c:10: error: syntax error before '}' token
    main.c: In function `CopySpecies':
    main.c:32: warning: implicit declaration of function `CreateSpecies'
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: error: dereferencing pointer to incomplete type
    main.c:32: warning: initialization makes pointer from integer without a cast
    main.c:33: warning: passing arg 1 of `CopyViscosity' from incompatible pointer type
    main.c:33: warning: passing arg 2 of `CopyViscosity' from incompatible pointer type
    Process terminated with status 1 (0 minutes, 0 seconds)
    7 errors, 7 warnings
    Salut, j'envoie en PJ mon code : j'ai bien sûr laissé l'erreur de prototype dans ma fonction CopyViscosity().

    Le simple warning que j'obtiens est :

    Sources/species.c: In function `CopySpecies':
    Sources/species.c:64: warning: passing arg 1 of `CopyViscosity' from incompatible pointer type
    Sources/species.c:64: warning: passing arg 2 of `CopyViscosity' from incompatible pointer type
    pourquoi n'est-ce pas plutôt une ERREUR et non un simple warning ?
    Fichiers attachés Fichiers attachés

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Le simple warning que j'obtiens est :
    <...>
    pourquoi n'est-ce pas plutôt une ERREUR et non un simple warning ?
    Parce que le C est 'faiblement typé' et qu'il autorise ce genre de manip qui peut être valide si on sait ce qu'on fait. Ce warning (un plus du compilateur, comme tous les warnings) est à prendre très au sérieux.

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Parce que le C est 'faiblement typé' et qu'il autorise ce genre de manip qui peut être valide si on sait ce qu'on fait. Ce warning (un plus du compilateur) est à prendre très au sérieux.
    Re,
    merci de cette précision (merci encore de ton site dans lequel il y a toutes ces options de compilation). Dans mon 1e post j'avais aussi posé une autre question :

    L'erreur que j'obtenais à la fin de mon programme, lors de la libération de toute la mémoire allouée, était celle-ci :

    out(3093,0xa000d000) malloc: *** Deallocation of a pointer not malloced: 0x3098a0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug
    ce qui se comprend bien vue ma faute de prototype... Mais pourquoi ai-je cette erreur sur mon Mac intel (gcc version 3.0) et pourquoi n'apparait-elle pas sur mon linux Suse pro 9.3 (gcc version 3.0) ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Mais pourquoi ai-je cette erreur sur mon Mac intel (gcc version 3.0) et pourquoi n'apparait-elle pas sur mon linux Suse pro 9.3 (gcc version 3.0) ?
    Parce que chaque système a ou non son mécanisme de surveillance de la mémoire... ou plutôt que les réactions de celui-ci sont plus ou moins visibles...

    Eh, oui, les comportements indéterminés, ça fout la trouille ! (Surtout dans le monde réel, plus particulièrement quand le logiciel a la vie de personnes 'entre ses mains'...)

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

Discussions similaires

  1. problème lors de la compilation
    Par snake264 dans le forum Dev-C++
    Réponses: 5
    Dernier message: 14/11/2006, 20h07
  2. Réponses: 4
    Dernier message: 25/09/2006, 10h24
  3. Problème lors de la compilation
    Par nicolas66 dans le forum C++
    Réponses: 9
    Dernier message: 25/07/2006, 22h32
  4. problème lors de la compilation : Unsatisfied symbols
    Par la schtroumpfette dans le forum C
    Réponses: 6
    Dernier message: 29/12/2005, 09h52
  5. Réponses: 7
    Dernier message: 27/09/2005, 21h40

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