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 :

tableau de dimension variable


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut tableau de dimension variable
    Bonsoir,
    Je souhaiterais avoir des précisions sur ce genre de construction où la taille du tableau n'est connue que lors de l'appel de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void func(t param)
    {
        int n;
        /* some code */
        n = compute_n(param);
        {
            int arr[n];
            /* make use of arr */
        }
    }
    - Est-ce portable ?
    - Est-ce équivalent à un malloc/free du tableau ?
    - Quel est le nom de cette fonctionnalité ? (afin de pouvoir chercher sur un moteur de recherhe)
    - Est-ce une pratique déconseillée ou pas ?
    (je suis preneur pour toutes informations...)

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonsoir,

    Cela s'appelle un V.L.A., pour Variable Length Array, soit littéralement « tableau de dimension variable », comme tu as nommé ta discussion (volontairement ?). C'est portable, mais ça date de C99, si je ne dis pas de bêtises.

    Par contre, ce n'est pas un équivalent de free() et malloc() : ce tableau est créé dans la pile, comme les tableaux ordinaires de taille fixe.

    Ce n'est pas déconseillé, mais les recommandations sont les mêmes que pour les tableaux ordinaires : être sobre. Pas question de remplir la pile avec un tableau d'une centaine de méga-octets. Toutefois, je ne trouve pas très propre l'exemple que tu proposes, où un bloc est volontairement ouvert au milieu de la fonction rien que pour déclarer un tableau. Cela dit, ça permet quand même de le faire disparaître dès que l'on n'en a plus besoin.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Le problème si je ne mets pas un bloc c'est que le code va mélanger déclaration de variable et code. N'est-ce pas gênant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void func(t param)
    {
        int n;
        /* some code */
        n = compute_n(param);
        int arr[n];
        /* make use of arr */
    }

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par kapaty Voir le message
    Le problème si je ne mets pas un bloc c'est que le code va mélanger déclaration de variable et code. N'est-ce pas gênant ?
    Si, mais justement, c'est ça que je trouve sale en soi :-) Ton code est légal, mais il ne faudrait pas utiliser cette astuce pour contourner une limitation. Pas trop souvent, en tout cas… :-)

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Et si j'arrive à me débrouiller pour modifier le code précédant de manière à enlever la partir /* some code */ du code précédant pour donner ceci, est-ce que c'est plus "propre" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void func(t param)
    {
        int n = compute_n(param);
        int arr[n];
        /* make use of arr */
    }

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par kapaty Voir le message
    Et si j'arrive à me débrouiller pour modifier le code précédant de manière à enlever la partir /* some code */ du code précédant pour donner ceci, est-ce que c'est plus "propre" :
    Bof, non pas vraiment puisqu'il y a quand même exécution de code au milieu de la déclaration des variables. Fais comme tu le sens, en fait, car je n'ai pas d'argument rationnel et solide à te fournir. La première méthode a l'avantage certain de libérer le tableau au plus vite. Mais il est vrai que les blocs sans condition, s'ils sont légaux, sont quand même souvent là pour pallier une autre difficulté.

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    En cherchant sur internet de la doc sur Variable Length Array j'ai par exemple trouvé cette page qui est intéressante, je la donne car ça peut peut-être intéressé d'autres personnes.

    http://docs.cray.com/books/004-2179-...34830malz.html

    Si je comrends bien la section "3.5.7. switch Statement", je crois comprendre que mettre mon VLA dans un bloc { } ne smeble pas poser de problèmes.

    Merci Obsidian pour tes réponses

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  2. tableau à dimension variable
    Par bubuche87 dans le forum Débuter
    Réponses: 6
    Dernier message: 20/11/2007, 20h21
  3. tableau à dimension variable
    Par dnmfaw dans le forum Débuter
    Réponses: 5
    Dernier message: 10/09/2007, 18h09
  4. [débutant] un tableau de dimension variable selon l'objet qui le contient
    Par Epistocles dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/01/2007, 18h07
  5. tableau à dimension variable
    Par Phoenix_Blue dans le forum C++
    Réponses: 17
    Dernier message: 18/11/2006, 14h17

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