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
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 385
    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
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    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 Expert 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
    Par défaut
    Peux tu poster un code qui compile qu'on puisse reproduire l'erreur!

  5. #5
    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
    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
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    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 confirmé
    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
    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 Expert 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
    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 confirmé
    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
    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 Expert 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
    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
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    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 émérite 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
    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 confirmé
    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
    Par défaut
    Effectivement... c'était une autre belle erreur.

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 385
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ 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