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 :

Allocation dynamique : comment avoir un tableau à 3Dimension..


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 23
    Points
    23
    Par défaut Allocation dynamique : comment avoir un tableau à 3Dimension..
    Bonjour !
    tout est dans le titre : comment avoir un tableau à 3Dimension.., aveb, svp, allocation dyn....
    parce ce que la je ne sais pas comment faire... (avec malloc), j'aimerai bien un petit exemple svp.
    et est-ce qui sera possible d'avoir la 3e dimension a taille variable ?? (cad chaque sous-sous-tableau pourra avoir sa taille a lui ??

    merci pour vos réponse
    @+

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour avoir un tableau ainsi fait (première dimension forcément invariante, seconde dimension invariante, troisième dimension variable), je conseillerais un tableau à deux dimensions de tableaux.

    Pour le tableau à deux dimensions, je conseille de faire ainsi: Un tableau de pointeurs pointant vers les lignes d'un tableau alloué en bloc, ce qui fait deux allocations:
    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
    /* Pour des int: 
       Cette fonction retourne un tableau 2D de int* non-initialisés. */
    int *** AllocTablePtrInt2D(size_t n1, size_t n2)
    {
    	/* Première allocation : tableau extérieur */
    	int *** p1 = malloc( n1 * sizeof(*p1) );
    	if(p1 != NULL)
    	{
    		/* Seconde allocation : tableau intérieur */
    		int ** p2 = malloc( n1 * n2 * sizeof(*p2) );
    		if(p2 != NULL)
    		{
    			/* Attache les pointeurs de p1 à p2 */
    			size_t i;
    			for(i=0 ; i<n1 ; i++)
    			{
    				p1[i] = &p2[i*n2];
    			}
    		}
    		else
    		{
    			/* Echec d'allocation de p2 : Détruit p1 */
    			free(p1);
    			p1 = NULL;
    		}
    	}
    	return p1;
    }
     
    /* Destruction d'un tableau 2D.
       Ne touche pas aux pointeurs du tableau. */
    void FreeTablePtrInt2D(int ***pDel)
    {
    	free(*pDel);
    	free(pDel);
    }
    Ce code sert juste à la création et à la destruction du tableau de pointeurs.
    Ensuite, tu peux t'occuper comme tu veux des pointeurs dedans...

    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
    int main(void)
    {
    	int *** tab = NULL;
    	size_t x, y;
     
    	tab = AllocTablePtrInt2D(3, 2);
    	if(tab != NULL)
    	{
    		/* Initialise à NULL les pointeurs du tableau */
    		for(x=0 ; x<3 ; x++)
    		{
    			for(y=0 ; y< 2 ; y++)
    			{
    				tab[x][y] = NULL;
    			}
    		}
     
    		/* Jouer un peu avec ton tableau 2D de pointeurs */
    		/* ... */
     
    		/* Destruction du tableau */
    		FreeTablePtrInt2D(tab);
    		tab = NULL;
    	}
    	return 0;
    }
    Malheureusement, je n'ai pas testé. Mais c'est l'idée générale...
    Edit: Testé!
    Ça a l'air OK...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    merci, j'essai ça quand j'orais un peu de temps...(enfin fo que je l'adapte, et que j'ai le courage de m'y remettre )
    merci bocoup !

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Je le rappelle, ce code alloue juste un tableau 2D de pointeurs.
    Ensuite, tu fais ce que tu veux des pointeurs, et là tu peux y allouer des tableaux de la taille que tu veux...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/09/2010, 13h50
  2. Réponses: 0
    Dernier message: 16/03/2010, 16h47
  3. Réponses: 18
    Dernier message: 06/07/2005, 14h58
  4. Comment passer un tableau dynamique en paramètre ?
    Par Charette dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2005, 11h28
  5. [Tableau] Allocation dynamique du contenu
    Par VincenzoR dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 08/05/2004, 20h57

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