Allocation statique VS allocation dynamique

Fermé
Tunisiano87 Messages postés 15 Date d'inscription dimanche 23 novembre 2008 Statut Membre Dernière intervention 13 avril 2010 - 23 nov. 2008 à 19:10
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 23 nov. 2008 à 22:15
Bonjour,

Salut,
Je suis bloqué depuis quelques jours dans mon tp qui consite à faire des modifictation d'un code pour qu'il soit basé sur l'allocation dynamique.
Bref, ce qui me bloque c'est cette fonction:


# define TAILLE 9

typedef enum { VIDE, PLEINE } StatutCase;
typedef enum { IMPOSSIBLE, POSSIBLE } StatutValeur;

typedef struct {
StatutCase statut;
union {
/* Si statut == PLEINE, contient la valeur de la case */
char valeur;
/* Si statut == VIDE, contient un tableau tel que chaque case
alternatives[i] contient 0 pour une valeur i impossible,
1 pour une valeur i possible */
StatutValeur alternatives[TAILLE];
} contenu;
} Case;

struct Grille{
char nbCasesAJouer;
Case grille[TAILLE][TAILLE];
};

Sudoku sudokuCree(void) {
Sudoku sudoku = (Sudoku) malloc(sizeof(struct Grille));
int i, j;
Case case_vide;

if (sudoku == NULL)
return sudoku;

case_vide.statut = VIDE;
for (i=0; i < TAILLE; i++)
case_vide.contenu.alternatives[i] = POSSIBLE;

sudoku -> nbCasesAJouer = TAILLE * TAILLE;
for (i=0; i < TAILLE; i++)
for (j=0; j < TAILLE; j++)
sudoku -> grille[i][j] = case_vide;

return sudoku;
}


Ca c'est le code initial, on doit modifier cette fonction de facon a ce que TAILLE lui soit passé en paramètre, et en faisant bien sur de l'allocation dynamique.
Perso, j'ai essayé cela mais ca n'a pas marché. Si quelqu'un aura la gentillesse de m'aider, je lui serais extrêmement reconnaissant:
Voila mon code:

Sudoku sudokuCree(int TAILLE) {
Sudoku sudoku = (Sudoku) malloc(sizeof(struct Grille));
int i, j;
Case case_vide;

if (sudoku == NULL)
return sudoku;

case_vide.statut = VIDE;

case_vide.contenu.alternatives = (StatutValeur *) malloc (TAILLE * sizeof (StatutValeur) );
if (case_vide.contenu.alternatives == NULL)
return NULL;

for (i=0; i < TAILLE; i++)
case_vide.contenu.alternatives[i] = POSSIBLE;

sudoku -> nbCasesAJouer = TAILLE * TAILLE;

sudoku -> grille = (Case **) malloc (TAILLE * sizeof (Case*) );
if (sudoku -> grille == NULL)
return NULL;


for (i=0; i < TAILLE; i++) {
sudoku -> grille[i] = (Case *) malloc (TAILLE * sizeof (Case) );
if (sudoku -> grille[i] == NULL)
return NULL;
}

for (i=0; i < TAILLE; i++)
for (j=0; j < TAILLE; j++) {
sudoku -> grille[i][j].contenu.alternatives = (StatutValeur *) malloc (TAILLE * sizeof (StatutValeur) );
if (sudoku -> grille[i][j].contenu.alternatives == NULL)
return NULL;
sudoku -> grille[i][j] = case_vide;
}


return sudoku;
}


Merci.
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
23 nov. 2008 à 22:15
Salut,
J'ai pas lu ton code avec attention. En plus, c'est illisible, utilise la prochaine fois la balise code (bouton à droite de souligner). Ca gardera les indentations ;)
Lorsque tu réalises une allocation dynamique, c'est sur un pointeur.
Donc
 Sudoku*sudoku=malloc(sizeof(struct Grille));

Et, il est conseillé de vérifier le contenu de sudoku juste après. Car s'il y a une erreur d'allocation, malloc renverra NULL.
Du coup, tu risques d'avoir de jolis segfault par la suite ;
Donc, juste après l'allocation :
if(sudoku==NULL) exit(-1);
Ou tu mets un message explicatif, je te laisse broder ;)
J'espère que l'erreur, c'est juste le coup du pointeur.
Cdlt
0