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] Question de declaration.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut [Tableau] Question de declaration.
    Dans un projet (c'est pas la pêne de dire lequel cela n'a pas de rapport),
    Mon binôme déclarait, un tableau dynamique de la façon suivant :

    i est un paramètre calculé :

    int tab[i];

    puis l'initialisait de la manière suivante :
    int j;
    for(j=0;j<0;j++){
    tab[i]=Math.random();
    }

    Ce que je ne comprend pas c'est pourquoi cela marche, car depuis que je fais du C, j'ai toujours fait malloc pour les tableaux de dimension dynamique !

    En y regardant de plus près j'ai fait quelques test :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(int nbarg,char ** argv){
    	int i=12;
    	int ent1[i];
    	int ent2[15];
    	ent1[10]=144443;
    	ent2[10]=45;
    	printf("ent1[10]=%i\n",ent1[10]);
    	printf("ent2[10]=%i\n",ent2[10]);
    }

    cela renvoi =>
    Code Sortie : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ent1[10]=144443
    ent2[10]=45

    On m'aurait mentis ?

    me décourageant pas ... j'ai fait cet autre test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	int i=atoi(argv[1]);
    	char c=0x5D;
    	int ent1[i];
    	int ent2[15];
    	ent1[10]=144443;
    	ent2[10]=45;
    	printf("ent1[10]=%i\n",ent1[10]);
    	printf("ent2[10]=%i\n",ent2[10]);
    la le résultat est le même ... quelqu'un peut m'expliquer ?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut !


    Pour faire court, ceci:
    n'est pas un tableau dynamique mais statique ! Un tableau dynamique se déclare avec la notation de pointeur soit:
    et c'est à partir de là que tu doit utiliser malloc/calloc/realloc pour allouer l'espace nécessaire puis seulement après l'initialiser avec des valeurs !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    Comment cela statique ? puisque i est calculé ?

    Cela implique-t-il que lorsqu'on déclare "int tab[i]", l'espace allouée est libéré quand on sort du bloque où il est déclaré ?

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Est un tableau statique dans le sens où le tableau est stocké dans la pile du programme, non le tas pour ce qui touche à l'allocation dynamique par exemple. Le fait de calculer i n'en fait pas de tab un tableau dynamique au vrai sens du terme car sa taille ne peut varier durant l'exécution contrairement aux tableaux alloués dynamiquement !

    Les tableaux statiques sont aussi dans la plupart des cas (si ce n'est tout le temps), des tableaux dont les cases sont contigues et ils sont effectivement détruits automatiquement lors de la sortie de la fonction dans laquelle ils sont déclarés ce qui n'est encore une fois pas le cas des tableaux alloués dynamiquement car pour ceux-ci, il faut que tu les libères toi même par l'appel à la fonction free !

    Pour finir, d'après ton exemple, il me semble que certains compilateurs (du moins ceux qui respectent les normes à ce que j'en sais) refusent la déclaration d'un tableau statique avec une valeur dynamique donc non spécifiée à la compilation ! Le mieux reste alors sans aucun doute d'utiliser des tableaux alloués dynamiquement !

    Ca te vas ainsi les explications ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    Merci, j'ai bien comprit la différence.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    C'est une nouveaute introduite par la version 99 de la norme appele Variable Length Array (VLA).

    Avec cette version de la norme il est possible de creer un tableau dont la taille est une variable mais non une constante connue a la compilation.

    J'attire ton attention sur le fait:
    * que c'est une variable locale comme tout tableau traditionnel et donc qu'on ne peut pas l'employer en lieu et place de l'allocation dynamique (en particulier, on ne peut pas la retourner dans une fonction)
    * qu'on ne peut pas savoir si la memoire disponible est sffisante, d'ou un risque non negligeable de plantage.
    * et enfin il existe peu de compilateur implementant entierement et correctement ce point de la norme.

    En conclusion, je conseillerais plutot d'eviter d'utiliser ce mecanisme.

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    Merci pour cette précision... je continuerai donc a faire des malloc et des free !
    avec des testes sur les pointeurs de malloc !

    Je me disais bien avoir lu qu'on pouvais pas le faire quelque part... comme j'ai commencé le C sous Windows (sous borland si je me souviens bien), et que maintenant je travail sous linux, cela m'avais fait tous drôle de voir que cela marchais !

    Un grand merci donc au deux commentaires !

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

Discussions similaires

  1. tableau de string (declaration + remplissage)
    Par cortex59 dans le forum C++
    Réponses: 4
    Dernier message: 13/01/2009, 11h45
  2. Valeurs d'un tableau [question de débutant]
    Par bonilla dans le forum VB.NET
    Réponses: 1
    Dernier message: 22/06/2007, 11h03
  3. [html dreamweaver] question image et tableau
    Par celina5880 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 13/04/2005, 17h03
  4. [LG]Déclaration d'un tableau.
    Par Mike888 dans le forum Langage
    Réponses: 36
    Dernier message: 24/12/2003, 17h42
  5. Declaration d objets en tableau
    Par Spin dans le forum Composants VCL
    Réponses: 6
    Dernier message: 16/03/2003, 22h18

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