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 tableaux 4 dimensions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Par défaut Allocation dynamique tableaux 4 dimensions
    Bonjour,

    Je cherche à allouer de la mémoire en utilisant soit malloc ou calloc. J'ai lu beaucoup de choses sur la toile mais c'est des exemples pour des tableaux à une ou deux dimensions .

    exemple pour un tableau 1 dimension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int* tab = NULL;
        tab = malloc(largeur * sizeof(int));
    et pour un tableau a 2 dimensions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int ** tab = malloc(nblignes*sizeof(int));
    for(int i = 0, i < nblignes; ++i)
    {
        tab[i] = malloc(nbcolonnes*sizeof(int));
    }
    //et tab[x][y] pour acces aux elements
     
    //libération de la memoire
    for(int i = 0, i < nblignes; ++i)
    {
        free(tab[i]);
    }
    free(tab);
    Il y a bien évidement des versions sans les crochets []...

    Cependant je n'arrive pas à l'adapter au cas d'un tableau de plus de 3 dimensions, précisément 4 du style

    Comment allouer de la mémoire dans ce cas?
    Pour l'accès aux différents éléments du tableau je suppose que le principe est le même qu'un tableau normal multidimensionnel.

    D'avance merci pour vos éclaircissements.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mecaplus Voir le message
    Cependant je n'arrive pas à l'adapter au cas d'un tableau de plus de 3 dimensions, précisément 4 du style
    Qu'est-ce qui te poses problème ?


    C'est exactement le même principe..


    Tu auras comme base des ***** et non des **

  3. #3
    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
    Allouer un tableau 4D int [i][j][k][l] :
    1- Allouer un tableau de i pointeurs int***
    2- Pour chaque pointeur, allouer 1 tableau 3D int [j][k][l]

    Allouer un tableau 3D int [j][k][l] :
    1- allouer un tableau de j pointeurs int**
    2- pour chaque pointeur, allouer 1 tableau 2D int [k][l]

    Allouer un tableau 2D int [k][l] :
    1- allouer un tableau de k pointeurs int*
    2- pour chaque pointeur, allouer 1 tableau 1D int [l]

    Allouer un tableau 1D int [l] :
    1- allouer un tableau de l int

    Remarque : Erreur ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ** tab = malloc(nblignes*sizeof(int *));
    for(int i = 0, i < nblignes; ++i)....

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Par défaut
    Effectivement il y a une erreur
    Citation Envoyé par diogene Voir le message
    Remarque : Erreur ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ** tab = malloc(nblignes*sizeof(int *));
    for(int i = 0, i < nblignes; ++i)....
    Je vais donc faire ceci pour allouer dynamiquement de la memoire à un tableau 2d (ici nblignes=nbcolonnes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int **tab;
    tab=( int**) malloc (sizeof( int*)*nblignes);
     
    	for (k=0; k<nbligness; k++)
    	{
    		tab[k]=( int*) malloc (sizeof(int)*nbcolonnes);
    	}
    après avoir testé que l'allocation a réussie,
    je peux accéder aux données de la manière suivante :
    comme pour un tableau normal.

    ensuite une fois que je n'ai plus besoin d'utiliser ce tableau je libère la memoire allouer en faisant :
    ça fonctionne donc de cette manière.
    Maintenant je vais essayer de passer à une dimension supérieure à 2 et là c'est pas encore tout à fait claire.

    Est ce que j'ai le droit de faire ceci pour un tableau 3d?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int ***Tableau= (int ***)calloc(dimension1, sizeof(int**));
    	int i, j,k;
     
    	for(i= 0; i < dimension1; i++)
    	{
    		tab3[i]= (int **)calloc(dimension2, sizeof(int*));
    		for(j= 0; j < dimension2; j++)
    			tab3[i][j]= (int *)calloc(dimension3, sizeof(int));
    		}
    	}
    l'allocation dynamique réussie mais quand je souhaite accéder ou remplir tab3[i][j][k] comme le montre le code ci-dessous, ça plante (je suis sous windows, MinGW).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (i=0;i<dimension1;i++){
         for (j=0;j<dimension1;j++){
             for (k=0;k<dimension1;k++){
                 tab3[i][j][k]=10
             }
          }
    }
    Quelqu'un a une explication? Merci.

  5. #5
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Tu n'utilise pas les mêmes dimensions que pour la création :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i=0;i<dimension1;i++){
         for (j=0;j<dimension1;j++){
             for (k=0;k<dimension1;k++){
                 tab3[i][j][k]=10
             }
          }
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Par défaut
    Merci pour ta réponse.

    Citation Envoyé par Lucien63 Voir le message
    Tu n'utilise pas les mêmes dimensions que pour la création :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i=0;i<dimension1;i++){
         for (j=0;j<dimension1;j++){
             for (k=0;k<dimension1;k++){
                 tab3[i][j][k]=10
             }
          }
    }
    ok, juste une erreur lorsque j'ai recopié, mais le problème ne viendrait pas de là puisque dimension1=dimension2=dimension3.

    Mais pour faire propre et pour l'adapter à un tableau quelconque 3d, je suis d'accord avec toi pour écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i=0;i<dimension1;i++){
         for (j=0;j<dimension2;j++){
             for (k=0;k<dimension3;k++){
                 tab3[i][j][k]=10
             }
          }
    }

Discussions similaires

  1. decalaration dynamique tableaux deux dimensions et TRI
    Par Alex35 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/12/2007, 13h48
  2. Tableaux 2 dimensions dynamiques
    Par onegamer dans le forum Struts 1
    Réponses: 1
    Dernier message: 06/07/2006, 12h55
  3. allocation dynamique et tableaux de pointeurs
    Par gbardy dans le forum 4D
    Réponses: 3
    Dernier message: 06/07/2006, 11h08
  4. Réponses: 6
    Dernier message: 26/11/2005, 19h55
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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