Tableau de struct

Résolu/Fermé
Laura - 21 mars 2013 à 22:58
 Laura - 22 mars 2013 à 14:37
Bonjour,

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 ?
A voir également:

4 réponses

mamiemando Messages postés 33385 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
22 mars 2013 à 12:38
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
2
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
22 mars 2013 à 12:50
Un plateau avec des cases et des pions dedans, c'est beau :-)

[Dal] <-- ému
0
Merci pour la réponse, mais en fait je fais un jeu d'abalone, les cases sont hexagonales (et il en 61 pas 64, je me suis trompée) alors je me suis dit que ça serait plus pratique d'acceder aux cases adjacentes comme ça au lieu d'utiliser un tableau à plusieurs dimension
0
Je vais m'inspirer de la découpe plateau/case/pion en l'adaptant à mon cas, ça a l'air pratique ce que tu as fait
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 22/03/2013 à 10:27
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
1
Merci pour ta réponse :) ça marche mieux comme ça ^^
1
mamiemando Messages postés 33385 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
22 mars 2013 à 01:19
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
0
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 ?
0