Tableau de struct
Résolu
Laura
-
Laura -
Laura -
Bonjour,
j'ai défini une structure comme ceci :
et j'aimerai faire une fonction qui initialise un tableau de pionts, j'ai tenté ceci :
mais je ne comprends pas pourquoi il y a une erreur ?
j'ai défini une structure comme ceci :
typedef struct piont piont;
struct piont{
char etat;
char lettre;
int ligne;
piont *est, *ouest, *n_est, *n_ouest, *s_est, *s_ouest;
};
et j'aimerai faire une fonction qui initialise un tableau de pionts, j'ai tenté ceci :
void initialisation(piont *plateau){
int i;
for (i=0; i<10; i++) {
plateau[i] = {'B', 'I', i, NULL, NULL, NULL, NULL, NULL, NULL}; // erreur ici
}
}
mais je ne comprends pas pourquoi il y a une erreur ?
4 réponses
-
Oui j'ajouterais que visiblement vu que c'est un plateau de 64 cases donc j'imagine 8*8, il serait plus logiques d'avoir un plateau du genre :
#include <stdlib.h> #include <assert.h> #define NUM_ROWS 8 #define NUM_COLS 8 typedef struct case_t { pion_t * pion; // NULL si vide, adresse du pion_t sinon }; // plateau[i][j] désigne la case (i, j), avec // 0 <= i < NUM_ROWS // 0 <= j < NUM_COLS typedef plateau_t { case_t ** cases; } plateau_t; plateau_t * new_plateau() { size_t i; plateau_t * plateau = malloc(sizeof(plateau_t)); plateau->cases = NUM_ROWS * sizeof(case_t *)); for(i = 0; i < NUM_COLS; ++i) { plateau->cases[i] = malloc(NUM_COLS * sizeof(case_t)); } return plateau; } void free_plateau(plateau_t * plateau) { for(i = 0; i < NUM_COLS; ++i) { free(plateau->cases[i]); } free(plateau->cases); free(plateau); } pion_t * get_piece(size_t i, size_t j) { assert(i < NUM_ROWS); assert(j < NUM_COLS); return plateau->cases[i][j]; } void set_piece(size_t i, size_t j, pion_t * pion) { assert(i < NUM_ROWS); assert(j < NUM_COLS); plateau->cases[i][j] = pion; } typedef struct pion_t { char etat; char lettre; } pion_t; int main() { plateau_t * plateau = new_plateau(); // place/récupère des pieces avec get_piece et set_piece free_plateau(plateau); return 0; }
... car d'un point de vue "design" je ne vois pas pourquoi un pion a des raisons de stocker les éventuels pions adjacents, ce n'est pas ce qui caractérise un pion. Par exemple si tu codes un jeu d'échec, ce qui caractérise un pion, c'est sa nature (pion, tour, cavalier...) et sa couleur (noir ou blanc).
Bonne chance -
Salut Laura,
Tu as une erreur dans :
plateau[i] = {'B', 'I', i, NULL, NULL, NULL, NULL, NULL, NULL};
car cette notation permettant l'initialisation n'est permise qu'à l'occasion de la déclaration.
Ta fonction devrait donc ressembler à ceci (avec les aménagements à la struct proposés par mamiemando) :
void initialisation(pion_t *plateau) { int i; for (i = 0; i < 10; i++) { plateau[i].etat = 'B'; plateau[i].lettre = 'I'; plateau[i].ligne = i; plateau[i].e = plateau[i].w = plateau[i].nw = plateau[i].ne = plateau[i].sw = plateau[i].se = NULL; } }
Dal -
Alors à ta place je noterais "piont" plutôt "pion_t" pour respecter les conventions usuelles du C. Ensuite pour plus de lisibilité je noterais directement est, ouest, n_ouest etc... n, e, nw. Bon mais ça c'est du détail :-)
Pour créer un pion tu peux écrire :
#include <stdlib.h> typedef struct pion_t{ char etat; char lettre; int ligne; struct pion_t *e, *w, *nw, *ne, *sw, *se; } pion_t; int main() { pion_t pion = { .etat = 'B', .lettre = 'I', .ligne = 1, .e = NULL, .w = NULL, .ne = NULL, .nw = NULL, .se = NULL, .sw = NULL }; return 0; }
Bonne chance -
merci pour la réponse :) mais en fait je cherche a creer pas mal de pions (il en a 64). Donc sans les nommer explicitement, et les mettre directement dans le tableau. (Un peu comme un tab[i] = new Piont(); en java) suis-je obligée de les nommer ?