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 'variably modified' ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut Erreur de compilation 'variably modified' ?
    Bonjour,

    J'ai une erreur sous GCC 4.2.0 à la compilation :
    Citation:
    error: variably modified 'sDescription' at file scope
    et le bout de code qui provoque ça est une simple déclaration:
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static const int ETAPIMP_MAX_BUFFER = 1020;
    typedef struct _import {
      char cType;
      char sDescription[ETAPIMP_MAX_BUFFER + 1];
    } Import_t;
    1) Que veut dire exactement ce message d'erreur ?
    2) Pourquoi est-ce une erreur ?

    Merci.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense que cela ne plait pas à ton compilateur que la taille du champs sDescription soit défini par une variable et pas un constante.

    ETAPIMP_MAX_BUFFER est une variable (certes, déclarée constante) mais une variable quand même
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Tu es entrain de réaliser un VLA (Variable Length Array), je ne pense pas que c'est cela que tu désires faire.

    L'erreur provient du fait que tu ne peux définir un VLA au niveau du "file scope". Tu dois le définir dans un "block scope", par exemple comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void func(int n)
    {
         typedef int A[n]; 
         A a;
     
         ...
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void func(int n)
    {
         int tab[n]; 
     
         ...
    }
    A noter que cela a été introduit par la norme C99.

    Sinon, dans ton cas, tu pourrais remplacer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const int ETAPIMP_MAX_BUFFER = 1020;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ETAPIMP_MAX_BUFFER   1020;

  4. #4
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut
    Merci de vos éclaircissements.

    J'ai fait 2 essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void foo()
    {
      static const int CSTE = 20;
      char toto1[CSTE];
      char toto2[CSTE + 1];
    }
    qui compile.
    et celui-la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static const int CSTE = 20;
    char toto1[CSTE];
    char toto2[CSTE + 1];
    void foo()
    {
    }
    qui ne compile pas.
    Donc c'est un pb de VLA (je pensais que ça pouvait être le "+ 1" qui embête le compilo).
    Malgré vos explications (et même si je parais présomptueux), cette erreur me parait... illogique.
    Ou alors, dans l'exemple 2, CSTE n'est pas assuré d'être initialisé avant les tableaux, ce qui expliquerait pourquoi toto1 et toto2 soient traités comme des VLA.

  5. #5
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Array objects declared with the static or extern storage-class specifier
    cannot have a variable length array (VLA) type.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Array objects declared with the static or extern storage-class specifier
    cannot have a variable length array (VLA) type.
    Je crois que c'est clair ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre expérimenté Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Par défaut


    Si j'ai bien compris, l'exemple suivant est valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static const int CSTE = 20;
    void foo()
    {
      char toto1[CSTE]; /* <- array object ni static ni extern*/
      char toto2[CSTE + 1]; /* <- array object ni static ni extern*/
    }
    (gcc le compile en tout cas... mais ce n'est pas suffisant)

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Grulim Voir le message
    Si j'ai bien compris, l'exemple suivant est valide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    static const int CSTE = 20;
    void foo()
    {
      char toto1[CSTE]; /* <- array object ni static ni extern*/
      char toto2[CSTE + 1]; /* <- array object ni static ni extern*/
    }
    Oui, d'ailleurs, CSTE n'a même pas besoin d'être constant pour que la déclaration reste valide.

  9. #9
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Donc c'est un pb de VLA (je pensais que ça pouvait être le "+ 1" qui embête le compilo).
    Malgré vos explications (et même si je parais présomptueux), cette erreur me parait... illogique.
    Ou alors, dans l'exemple 2, CSTE n'est pas assuré d'être initialisé avant les tableaux, ce qui expliquerait pourquoi toto1 et toto2 soient traités comme des VLA.
    Je m'avance peut être (rectifiez moi si je me trompe), mais je pense que cela vient du fait qu'un VLA est évidemment déterminé au moment de l'exécution, comme pour une allocation dynamique, et non au moment de la compilation comme cela aurait été pour un tableau statique.

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

Discussions similaires

  1. [XL-2010] Erreur de compilation Variable ou procédure attendue et non un module
    Par Denis_67 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 05/12/2014, 12h44
  2. [AC-2007] Erreur de compilation: Variable non définie
    Par m1koo dans le forum VBA Access
    Réponses: 7
    Dernier message: 11/01/2014, 18h21
  3. [XL-2010] Erreur de compilation : variable non définie sur un textbox
    Par Bricomachin dans le forum Excel
    Réponses: 4
    Dernier message: 12/04/2013, 11h56
  4. Erreur de compilation : Variable non définie
    Par Smallstone dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 12/07/2011, 08h32
  5. erreur de compilation variable non defini
    Par nabelou1 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/01/2009, 16h43

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