|
|
|
|
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.
Configuration: Windows XP Internet Explorer 7.0
Salut,
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 Google is your friend |