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 :

Initialisation d'un tableau (VLA)


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut Initialisation d'un tableau (VLA)
    Bonjour,

    Pourquoi cela est légal:

    et cela est illégal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int nl = 6;
    int sum[nl] = {0};
    j'essaye d'initialiser les membres de l'array sum[], mais le compileur n'est pas content.

    bobwinner.c: In function âmainâ:
    bobwinner.c:50: error: variable-sized object may not be initialized
    bobwinner.c:50: warning: excess elements in array initializer
    bobwinner.c:50: warning: (near initialization for âsumâ)
    Des idées comment initialiser tout les membres de l'array sum[var] sans utiliser de for loop ? Sachant que var est déjà constante et qu'elle ne changera jamais.

    et merci...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La taille d'un "tableau statique"1 doit être une constante connue à la compilation.
    L'exception à cette règle est autorisée par la "récente" norme C99, sous le nom
    "Variable-Length Array" (VLA).
    Edit: Ah, en fait, tu utilises déjà un VLA. Apparemment, la norme interdit d'initialiser un VLA lors de sa déclaration. Enfin, tu peux obtenir l'équivalent avec une boucle for...
    Edit2: Je suis encore à côté de la question. Le problème semble être qu'en C, une "variable constante" n'est "pas assez constante" pour être considérée comme une constante connue à le compilation (il en est différemment en C++). Pour résoudre ton problème, je pense que nl devrait être une macro à la place (donc, selon les conventions de codage, définie en majuscules) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define NL 6
    int sum[NL] = {0};

    1 C'est souvent un abus de langage, à cause de la différence entre les trois types de mémoire: statique (globales), automatique (pile), dynamique (tas). La plupart des tableaux "statiques" sont en fait sur la pile, c'est-à-dire en mémoire automatique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    Merci pour la precision de la reponse.

    finalement, j'ai préféré utiliser une for loop puisque l'équivalent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define NL 6
    int sum[NL] = {0};
    Defini 6 dans une macro, c'est vrai que j'ai dit que 6 et une constante. Mais en fait c'est une variable "nl" qui le deviens au milieu de mon programme, donc sa valeur est connue pour le reste du programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       int sum[nh], nhc; //array to sum all the votes per hall
       for (nhc = 0; nhc< nh; nhc++) sum[nhc]=0; //intialize all member of array to zero
    merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Bon. Mon GCC (4.3.0) accepte de faire ce que tu veux faire sans broncher en --std=c99 et met simplement un warning sinon. Il est suffisamment futé pour voir que j'ai affecté à ma variable la valeur d'une constante.

    Mais sinon, d'un point de vue plus global, j'aurais tendance à dire que tu dois pouvoir faire un VLA dès lors que ta variable se trouve à l'extérieur du bloc où tu déclares ton tableau, et ce parce c'est à l'entrée dans un bloc que le programme va allouer suffisamment de place dans la pile pour y loger ses variables locales. À ce moment, la valeur de ta variable est déjà fixée et elle peut être utilisée pour définir la place à allouer dans la pile.

    En revanche, dans ton exemple, ta variable et ton tableau sont au même niveau, et donc dans le même cadre de pile. Ça signifie que l'espace qui les contient tout les deux doit être alloué avant que la valeur de ta variable soit connue, puisque celle-ci n'existe pas encore. Elle ne peut donc pas servir à dimensionner ton tableau.

    Mais ce n'est qu'une intuition qui aurait besoin d'être vérifiée.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    ....
    Mais sinon, d'un point de vue plus global, j'aurais tendance à dire que tu dois pouvoir faire un VLA dès lors que ta variable se trouve à l'extérieur du bloc où tu déclares ton tableau, et ce parce c'est à l'entrée dans un bloc que le programme va allouer suffisamment de place dans la pile pour y loger ses variables locales. À ce moment, la valeur de ta variable est déjà fixée et elle peut être utilisée pour définir la place à allouer dans la pile.
    Ce n'est pas nécessaire, il suffit que la variable soit définie (et initialisée) avant le VLA

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

Discussions similaires

  1. Initialisation d'un tableau à plusieurs dimensions
    Par kinouseb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2007, 13h16
  2. Initialisation d'un tableau de pointeurs
    Par tintin72 dans le forum C++
    Réponses: 19
    Dernier message: 19/11/2006, 10h22
  3. Problème d'initialisation d'un tableau
    Par Premium dans le forum C
    Réponses: 13
    Dernier message: 31/05/2006, 14h48
  4. Débutant : initialisation d'un tableau
    Par lebokto dans le forum C++
    Réponses: 7
    Dernier message: 02/11/2005, 15h50
  5. Initialisation d'un tableau de type STRUCT
    Par Axiome dans le forum MFC
    Réponses: 4
    Dernier message: 06/09/2005, 10h58

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