Allocation statique VS allocation dynamique
Tunisiano87
Messages postés
17
Statut
Membre
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
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.
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:
- Allocation statique VS allocation dynamique
- Fiche pratique tableau croisé dynamique - Guide
- Udp vs tcp - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
- Liste déroulante dynamique excel - Guide
- Ddr3 vs ddr3l ✓ - Forum Matériel & Système
1 réponse
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
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 :
J'espère que l'erreur, c'est juste le coup du pointeur.
Cdlt
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