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 :

Problème malloc() tableau 3 dimensions


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Problème malloc() tableau 3 dimensions
    Bonjour, j'ai un petit problème concernant la réservation en mémoire d'un tableau à 3 dimensions. En effet j'aimerai créer un plateau de jeux hauteur* largeur (tableau deux dimensions) possédant certaines caractéristiques sur les cases (tableau 3 dimensions)
    Le tableau est bien créé quand la hauteur et la largeur sont les mêmes mais des qu'ils sont différents j'ai des bus error des que je veux visualiser tab[i][j][0] ou tab[i][j][1].
    Voici le code :
    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
     
    int ***tab=NULL;
    hauteur=5;
    largeur=10;
     tab = malloc(hauteur*sizeof(int**));
     
     for(i=0;i<hauteur;i++)
    	 tab[i]=malloc(largeur*sizeof(int*));
     
     for(i=0;i<hauteur;i++)
     {
    	 for(j=0;j<largeur;j++)
    	 {
    		 tab[i][j]= malloc(2*sizeof(int));
    	 }
     }
    L'erreur de gdb :
    Program received signal EXC_BAD_ACCESS, Could not access memory.
    Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
    0x00002d3d in main () at graphe.c:628
    628 printf(" %d ",tab[i][j][0]);
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Il manque un malloc au début du deuxième for.

    Voir aussi ce thread: http://www.developpez.net/forums/sho...d.php?t=558447

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je viens de regarder le thread mais je ne vois pas ou j'ai oublié le malloc.
    J'ai même essayer une autre méthode sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    tab = malloc(hauteur*sizeof*tab);
     
     for(i=0;i<hauteur;i++)
    	 tab[i]=malloc(largeur*sizeof*tab[i]);
     
     for(i=0;i<hauteur;i++)
     {
    	 for(j=0;j<largeur;j++)
    	 {
    		 tab[i][j]= malloc(2*sizeof*tab[i][j]);
    	 }
     }

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Peux tu poster un code qui compile qu'on puisse reproduire l'erreur!

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Il manque un malloc au début du deuxième for.
    Où vois-tu qu'il manque un malloc ?
    Le code m'a l'air correct sur le principe.
    Il s'agit peut-être d'une erreur d'indexation dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    628 printf(" %d ",tab[i][j][0]);

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Voila le code
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    int hauteur=6;
    int largeur=3;
    int i,j;
    int nbrsommets=0;
    int ***tab;
     
    //allocation du tableau 3D
    tab = malloc(hauteur*sizeof*tab);
     
     for(i=0;i<hauteur;i++)
    	 tab[i]=malloc(largeur*sizeof*tab[i]);
     
     for(i=0;i<hauteur;i++)
     {
    	 for(j=0;j<largeur;j++)
    	 {
    		 tab[i][j]= malloc(2*sizeof*tab[i][j]);
    	 }
     }
     
    //remplissage du tableau
    for (i=0;i<hauteur;i++)
    {
    	for(j=0;j<largeur;j++)
    	{
    	 tab[i][j][0]=0;
    	 tab[i][j][1]=0;
    	}
    }
     
     
    //remplissage de certaines valeurs spécifiques
    tab[2][3][0]=1;
    tab[1][1][0]=1;
    tab[5][4][0]=1;
    tab[3][3][0]=1;
    tab[5][3][0]=1;
    tab[1][4][0]=1;
    tab[0][3][0]=1;
    tab[1][3][0]=1;
    tab[0][4][0]=1;
    tab[0][4][0]=1;
    tab[3][1][0]=1;
    tab[4][1][0]=1;
    tab[3][5][0]=1;
     
    tab[0][0][1]=1;
    tab[0][2][1]=1;
    tab[2][2][1]=1;
     
    /*******Calcul du nombre de sommet***********/
     
    for (i=0;i<largeur;i++)
     {
     	for (j=0;j<hauteur;j++)
     	{
     	 if(tab[i][j][1]==1)
     	 { nbrsommets++; }
     	}
     }
     
    printf("Le nombre de sommet est %d\n",nbrsommets);
    /***********************************/
    /******** Affichage ***************/
     
    for (i=0;i<largeur;i++)
    {
    	for(j=0;j<hauteur;j++)
    	{
    	 printf(" %d ",tab[i][j][0]);
    	}
    printf("\n");
    }
     
     
     
    }
    Donc normalement il devrait compiler sans problème quand largeur=hauteur et bus error si largeur est différent de hauteur.

  7. #7
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Personnellement je préfère la 2ème méthode, avec des parenthèses après le sizeof (pour éviter la confusion multiplication/contenu de pointeur).

    Pourquoi dans le premier cas tu alloues 8 octets aux cases de la 3eme colonne alors que ton pointeur pointe sur des entiers (4 octets) ? Je sais pas si l'erreur peut venir de là mais bon...

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par madmox Voir le message
    Personnellement je préfère la 2ème méthode, avec des parenthèses après le sizeof (pour éviter la confusion multiplication/contenu de pointeur).
    Après un sizeof, l'étoile ne peut être qu'un déréférencement de pointeur, il ne peut y avoir de confusion.

  9. #9
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Je disais ça surtout pour la lisibilité en fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0;i<hauteur;i++)
    {
    	for(j=0;j<largeur;j++)
    	{
                  if(tab[i][j][1]==...
    Dans un cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i=0;i<largeur;i++)
    {
    	for(j=0;j<hauteur;j++)
    	{
                  tab[i][j][1]=...
    Dans l'autre...

    Y a forcément un problème ! Et ça explique aussi le fait que ça marche si hauteur = largeur.

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Hyris Voir le message
    Voila le code
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    int hauteur=6;
    int largeur=3;
    int i,j;
    int nbrsommets=0;
    int ***tab;
     
    //allocation du tableau 3D
    tab = malloc(hauteur*sizeof*tab);
     
     for(i=0;i<hauteur;i++)
    	 tab[i]=malloc(largeur*sizeof*tab[i]);
     
     for(i=0;i<hauteur;i++)
     {
    	 for(j=0;j<largeur;j++)
    	 {
    		 tab[i][j]= malloc(2*sizeof*tab[i][j]);
    	 }
     }
     
    //remplissage du tableau
    for (i=0;i<hauteur;i++)
    {
    	for(j=0;j<largeur;j++)
    	{
    	 tab[i][j][0]=0;
    	 tab[i][j][1]=0;
    	}
    }
     
     
    //remplissage de certaines valeurs spécifiques
    tab[2][3][0]=1;
    tab[1][1][0]=1;
    tab[5][4][0]=1;
    tab[3][3][0]=1;
    tab[5][3][0]=1;
    tab[1][4][0]=1;
    tab[0][3][0]=1;
    tab[1][3][0]=1;
    tab[0][4][0]=1;
    tab[0][4][0]=1;
    tab[3][1][0]=1;
    tab[4][1][0]=1;
    tab[3][5][0]=1;
     
    tab[0][0][1]=1;
    tab[0][2][1]=1;
    tab[2][2][1]=1;
     
    /*******Calcul du nombre de sommet***********/
     
    for (i=0;i<largeur;i++)
     {
     	for (j=0;j<hauteur;j++)
     	{
     	 if(tab[i][j][1]==1)
     	 { nbrsommets++; }
     	}
     }
     
    printf("Le nombre de sommet est %d\n",nbrsommets);
    /***********************************/
    /******** Affichage ***************/
     
    for (i=0;i<largeur;i++)
    {
    	for(j=0;j<hauteur;j++)
    	{
    	 printf(" %d ",tab[i][j][0]);
    	}
    printf("\n");
    }
     
     
     
    }
    Donc normalement il devrait compiler sans problème quand largeur=hauteur et bus error si largeur est différent de hauteur.
    Moi j'obtiens une erreur de segmentation!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Program received signal SIGSEGV, Segmentation fault.
    0x08048533 in main () at newmain.c:38
    38	tab[2][3][0]=1;

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai changé hauteur et largeur mais ca ne résout pas le problème.
    Sinon j'ai ca comme erreur avec gdb

    Program received signal EXC_BAD_ACCESS, Could not access memory.
    Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
    0x00001df6 in main () at test.c:38
    38 tab[2][3][0]=1;

    Sinon essaye de mettre hauteur=largeur=6 et la ca devrait compiler.

  12. #12
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Salut,

    Je ne vais pas plus loin ...
    Code Hyris : 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
            int hauteur=6;
            int largeur=3;
            <...>
    	//remplissage de certaines valeurs spécifiques
    	tab[2][3][0]=1; 
    	tab[1][1][0]=1;
    	tab[5][4][0]=1;
    	tab[3][3][0]=1;
    	tab[5][3][0]=1;
    	tab[1][4][0]=1;
    	tab[0][3][0]=1;
    	tab[1][3][0]=1;
    	tab[0][4][0]=1;
    	tab[0][4][0]=1;
    	tab[3][1][0]=1;
    	tab[4][1][0]=1;
    	tab[3][5][0]=1;
    
    	tab[0][0][1]=1;
    	tab[0][2][1]=1;
    	tab[2][2][1]=1;

  13. #13
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    Effectivement... c'était une autre belle erreur.

  14. #14
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Effectivement il n'y a pas à aller plus loin. L'erreur était donc dans la confusion de largeur et hauteur relevée par Madmox.
    Merci à vous pour votre aide.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Citation Envoyé par diogene Voir le message
    Où vois-tu qu'il manque un malloc ?
    Le code m'a l'air correct sur le principe.
    Il s'agit peut-être d'une erreur d'indexation dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    628 printf(" %d ",tab[i][j][0]);
    Désolé, je n'avais pas vu q'il avait séparé les boucles...

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

Discussions similaires

  1. Problème de tableau à deux dimensions
    Par _SamSoft_ dans le forum C
    Réponses: 5
    Dernier message: 05/12/2007, 10h31
  2. Problèmes paramètres tableau 2 dimension
    Par nico74 dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2007, 11h33
  3. [Débutant] Problème avec tableau à deux dimensions
    Par beegees dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/12/2006, 15h06
  4. [Tableaux] Problème tri de tableau à deux dimensions
    Par squall62 dans le forum Langage
    Réponses: 21
    Dernier message: 24/05/2006, 19h18
  5. Réponses: 5
    Dernier message: 24/05/2006, 09h59

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