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 :

Erreur de compilation non comprise


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 35
    Points
    35
    Par défaut Erreur de compilation non comprise
    Bonjour a tous,

    voila lorsque j'essaye de compiler une partie d'un projet avec gcc dont je mets le code (ceci est une version "light" afin de reproduire l'erreur juste)

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include <stdio.h>
    #include <string.h>
     
    enum SL_ID_CODE{    SL_FLOAT,
                        SL_DOUBLE,        
                        SL_INT,           
                        SL_CHAR,         
                        SL_STRING,       
                        SL_LONG,         
                        SL_UNDEF};
    typedef enum SL_ID_CODE SL_ID;
     
    #define SL_CHAR_FLOAT  "float"
    #define SL_CHAR_DOUBLE "double"
    #define SL_CHAR_INT    "int"
    #define SL_CHAR_CHAR   "char"
    #define SL_CHAR_STRING "string"
    #define SL_CHAR_LONG   "long"
     
    /**
     * \enum SL_ID_ERROR
     * \brief codes retour possibles
     *
     */
    enum SL_ID_ERROR{SL_OK, 
                        SL_ERROR,                 /*! < Une erreur est survenue*/
                        SL_ERROR_FILE_EXIST,      /*! < Tentative de creation d'un fichier deja existant*/
                        SL_ERROR_READ,            /*! < Erreur de lecture*/
                        SL_ERROR_WRITE,           /*! < Erreur d'écriture*/
                        SL_ERROR_OPEN_FILE,       /*! < Erreur à l'ouverture du fichier */
                        SL_ERROR_FILE_NOT_OPENED, /*! < Erreur de flux*/
                        SL_ERROR_UNKNOWN_DATA,    /*! < Type de données non reconnues*/
                        SL_ERROR_VAR_NOT_FOUND,   /*! < Variable non trouvée*/
                        SL_ERROR_TYPE_MISMATCH,   /*! < Types differents*/
                        SL_ERR0R_SL_NOT_INITIALISED};      /*! < Utilisation d'une liste non initialisée */
     
    typedef enum SL_ID_ERROR SL_CODE;
     
    /**
     * \union SL_VarType
     * \brief stockage de la valeur lue dans le fichier en fonction de son type
     *
     */
    typedef union 
       {
       double   slDouble;
       int      slInt;
       char     slChar;
       char     *slString;
       long     slLong;
       float    slFloat;
       } SL_VarType;
     
    typedef struct
    {
        SL_VarType value;
        SL_ID type;
    }SL_Var;
     
     
    typedef struct 
    {
        SL_Var contenu;
        FILE *file;              
    }StringList;
     
    SL_CODE SL_readFile(StringList const *Liste);
     
    /*lecture d'un fichier, fichier supposé ouvert par une autre fonction, de meme pour la fermeture */
    SL_CODE SL_readFile(StringList const *Liste)
    {
        SL_CODE sl_er=SL_OK;
        char buffer[1024];
        char *res=NULL;
        SL_Var element;
     
     
        if (Liste->file == NULL)
        {
            sl_er = SL_ERROR_FILE_NOT_OPENED;
            return sl_er;
        }
        rewind(Liste->file);  
     
     
     
        while(feof(Liste->file)==0)
        {
            res=fgets(buffer, sizeof buffer, Liste->file);
     
            if (res==NULL)
            {
                sl_er = SL_ERROR;
                break;
            }
     
           /*la partie de gestion des données recues avec fgets ont été supprimées   volontairement afin d'alleger le code copié */
            /*type de donnée */
            if (strncmp(buffer,SL_CHAR_INT,sizeof SL_CHAR_INT ) ==0) 
                {element.type=SL_INT;}
            else if (strncmp(buffer, SL_CHAR_DOUBLE ,sizeof SL_CHAR_DOUBLE ) ==0)  
                {element.type=SL_DOUBLE;}
            else if (strncmp(buffer, SL_CHAR_FLOAT  ,sizeof SL_CHAR_FLOAT )  ==0)  
                {element.type=SL_FLOAT;}
            else if (strncmp(buffer, SL_CHAR_LONG   ,sizeof SL_CHAR_LONG )   ==0)  
                {element.type=SL_LONG;}
            else if (strncmp(buffer, SL_CHAR_CHAR   ,sizeof SL_CHAR_CHAR )   ==0)  
                {element.type=SL_CHAR;}
            else if (strncmp(buffer, SL_CHAR_STRING ,sizeof SL_CHAR_STRING ) ==0)  
                {element.type=SL_STRING;}
            else
            {
                sl_er = SL_ERROR_UNKNOWN_DATA;
            }
       }
     
        return sl_er;
    }
    Donc quand j'essaye de compiler ce code, j'ai un message d'avertissement comme quoi le code à partir du premier "if" ne sera jamais executé.
    Hors j'avoue que je ne comprend pas trop pourquoi.
    Voici la ligne de commande de gcc
    gcc -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
    En plus court, il s'agit de la configuration "paranoia" donné par Emmanuel Delahaye bien souvent..

    Et quant à gcc, il s'agit de la version 4.1.2


    Merci d'avance,
    Bonne soirée/Journée,
    G.

    Edit : je ne cherche pas à créer un executable avec ce source mais uniquement un fichier objet

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 22
    Points : 25
    Points
    25
    Par défaut
    Salut,

    Je viens de tenter de compiler sous Code::Block et il me dis rien.

    Tu as testé ton code?

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par GuiYom00 Voir le message
    Bonjour a tous,

    voila lorsque j'essaye de compiler une partie d'un projet avec gcc dont je mets le code (ceci est une version "light" afin de reproduire l'erreur juste)

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include <stdio.h>
    #include <string.h>
     
    enum SL_ID_CODE{    SL_FLOAT,
                        SL_DOUBLE,        
                        SL_INT,           
                        SL_CHAR,         
                        SL_STRING,       
                        SL_LONG,         
                        SL_UNDEF};
    typedef enum SL_ID_CODE SL_ID;
     
    #define SL_CHAR_FLOAT  "float"
    #define SL_CHAR_DOUBLE "double"
    #define SL_CHAR_INT    "int"
    #define SL_CHAR_CHAR   "char"
    #define SL_CHAR_STRING "string"
    #define SL_CHAR_LONG   "long"
     
    /**
     * \enum SL_ID_ERROR
     * \brief codes retour possibles
     *
     */
    enum SL_ID_ERROR{SL_OK, 
                        SL_ERROR,                 /*! < Une erreur est survenue*/
                        SL_ERROR_FILE_EXIST,      /*! < Tentative de creation d'un fichier deja existant*/
                        SL_ERROR_READ,            /*! < Erreur de lecture*/
                        SL_ERROR_WRITE,           /*! < Erreur d'écriture*/
                        SL_ERROR_OPEN_FILE,       /*! < Erreur à l'ouverture du fichier */
                        SL_ERROR_FILE_NOT_OPENED, /*! < Erreur de flux*/
                        SL_ERROR_UNKNOWN_DATA,    /*! < Type de données non reconnues*/
                        SL_ERROR_VAR_NOT_FOUND,   /*! < Variable non trouvée*/
                        SL_ERROR_TYPE_MISMATCH,   /*! < Types differents*/
                        SL_ERR0R_SL_NOT_INITIALISED};      /*! < Utilisation d'une liste non initialisée */
     
    typedef enum SL_ID_ERROR SL_CODE;
     
    /**
     * \union SL_VarType
     * \brief stockage de la valeur lue dans le fichier en fonction de son type
     *
     */
    typedef union 
       {
       double   slDouble;
       int      slInt;
       char     slChar;
       char     *slString;
       long     slLong;
       float    slFloat;
       } SL_VarType;
     
    typedef struct
    {
        SL_VarType value;
        SL_ID type;
    }SL_Var;
     
     
    typedef struct 
    {
        SL_Var contenu;
        FILE *file;              
    }StringList;
     
    SL_CODE SL_readFile(StringList const *Liste);
     
    /*lecture d'un fichier, fichier supposé ouvert par une autre fonction, de meme pour la fermeture */
    SL_CODE SL_readFile(StringList const *Liste)
    {
        SL_CODE sl_er=SL_OK;
        char buffer[1024];
        char *res=NULL;
        SL_Var element;
     
     
        if (Liste->file == NULL)
        {
            sl_er = SL_ERROR_FILE_NOT_OPENED;
            return sl_er;
        }
        rewind(Liste->file);  
     
     
     
        while(feof(Liste->file)==0)
        {
            res=fgets(buffer, sizeof buffer, Liste->file);
     
            if (res==NULL)
            {
                sl_er = SL_ERROR;
                break;
            }
     
           /*la partie de gestion des données recues avec fgets ont été supprimées   volontairement afin d'alleger le code copié */
            /*type de donnée */
            if (strncmp(buffer,SL_CHAR_INT,sizeof SL_CHAR_INT ) ==0) 
                {element.type=SL_INT;}
            else if (strncmp(buffer, SL_CHAR_DOUBLE ,sizeof SL_CHAR_DOUBLE ) ==0)  
                {element.type=SL_DOUBLE;}
            else if (strncmp(buffer, SL_CHAR_FLOAT  ,sizeof SL_CHAR_FLOAT )  ==0)  
                {element.type=SL_FLOAT;}
            else if (strncmp(buffer, SL_CHAR_LONG   ,sizeof SL_CHAR_LONG )   ==0)  
                {element.type=SL_LONG;}
            else if (strncmp(buffer, SL_CHAR_CHAR   ,sizeof SL_CHAR_CHAR )   ==0)  
                {element.type=SL_CHAR;}
            else if (strncmp(buffer, SL_CHAR_STRING ,sizeof SL_CHAR_STRING ) ==0)  
                {element.type=SL_STRING;}
            else
            {
                sl_er = SL_ERROR_UNKNOWN_DATA;
            }
       }
     
        return sl_er;
    }
    Donc quand j'essaye de compiler ce code, j'ai un message d'avertissement comme quoi le code à partir du premier "if" ne sera jamais executé.
    Hors j'avoue que je ne comprend pas trop pourquoi.
    Voici la ligne de commande de gcc
    gcc -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
    En plus court, il s'agit de la configuration "paranoia" donné par Emmanuel Delahaye bien souvent..

    Et quant à gcc, il s'agit de la version 4.1.2


    Merci d'avance,
    Bonne soirée/Journée,
    G.

    Edit : je ne cherche pas à créer un executable avec ce source mais uniquement un fichier objet
    Parfois, il peut arriver que, du fait de la précision utilisée, les valeurs n'atteignent jamais les conditions attendues. Ex tu utilises un unsigned char c pour lire un fichier avec fgetc() et tu t'arrêtes sur -1. C'est à ce genre de truc qu'il faut penser quand le compilo t'indique ce genre d'erreur...

    PS: Ta boucle "while (feof(...))" est mal conçue. feof() ne s'emploie pas comme ça.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Parfois, il peut arriver que, du fait de la précision utilisée, les valeurs n'atteignent jamais les conditions attendues. Ex tu utilises un unsigned char c pour lire un fichier avec fgetc() et tu t'arrêtes sur -1. C'est à ce genre de truc qu'il faut penser quand le compilo t'indique ce genre d'erreur...
    Ok merci pour ces infos

    Citation Envoyé par Sve@r
    PS: Ta boucle "while (feof(...))" est mal conçue. feof() ne s'emploie pas comme ça.
    Quand à la bouche while, je viens un peu de regarder le fonctionnement de feof et donc en fait il faut que je mettes non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(fgets(buffer, sizeof buffer, Liste->file)!=NULL, !feof(Liste->file))

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 580
    Points
    41 580
    Par défaut
    Attention, j'ai des doutes sur ce que doit retourner sizeof "abc"...

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Attention, j'ai des doutes sur ce que doit retourner sizeof "abc"...
    4.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 580
    Points
    41 580
    Par défaut
    OK, mauvais exemple.
    L'expression sizeof "abcdef" est-elle garantie par la norme retourner 7, ou y a-t-il un risque non-nul qu'elle retourne sizeof(char const*) à la place ?

  8. #8
    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 : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par GuiYom00 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(fgets(buffer, sizeof buffer, Liste->file)!=NULL, !feof(Liste->file))
    Non. C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       while (fgets (buffer, sizeof buffer, Liste->file) != NULL)
       {
          ...
    tout simplement...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 42
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Non. C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       while (fgets (buffer, sizeof buffer, Liste->file) != NULL)
       {
          ...
    tout simplement...
    Merci bien, pourquoi faire simple quand on peut faire compliquer

    Citation Envoyé par Médinoc Voir le message
    OK, mauvais exemple.
    L'expression sizeof "abcdef" est-elle garantie par la norme retourner 7, ou y a-t-il un risque non-nul qu'elle retourne sizeof(char const*) à la place ?
    Je ne suis pas encore un expert dans la norme, que je n'ai découvert que tres recemment , mais si je comprend bien ce passage concernant la sémantique des chaines de caracteres :
    Citation Envoyé par C99 Commitee draft, p74
    In translation phase 7, a byte or code of value zero is appended to each multibyte
    character sequence that results from a string literal or literals.66) The multibyte character
    sequence is then used to initialize an array of static storage duration and length just
    sufficient to contain the sequence. For character string literals, the array elements have
    type char, and are initialized with the individual bytes of the multibyte character
    sequence;
    Cela voudrait dire que le caractere nul de fin de chaine est ajouté automatiquement ainsi sizeof "abcdef" retournerait forcement 7...

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/01/2012, 18h54
  2. Erreur fichier Alert non comprise
    Par Z3phur dans le forum Administration
    Réponses: 1
    Dernier message: 25/02/2008, 09h40
  3. Erreur de compilation non comprise
    Par coraziari_l dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/01/2008, 17h38
  4. [syntaxe] erreur de compilation pas comprise
    Par mamelouk dans le forum C++
    Réponses: 20
    Dernier message: 20/08/2007, 11h44
  5. [g++]Erreur de compilation non comprise
    Par GLDavid dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/05/2006, 15h16

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