Allocation dynamique d'un tableau de struct C

Fermé
TheChicken - Modifié par TheChicken le 11/05/2011 à 13:05
 le père - 11 mai 2011 à 15:49
Bonjour,
Je dois programmer un jeu de Yathzee pour un projet de fac en C, et j'ai un petit problème concernant une déclaration dynamique d'un tableau de structure. Je m'explique :
J'ai deux structure (dans deux fichier .C différent)

La première :
struct FeuilleScore { 
int partieSuperieure [9]; 
int partieInferieure [7]; 
int scoreFinal; 
}; 

(j'ai mis dans un fichier .h correspondant : struct feuilleScore;)

et la deuxieme :
(j'ai mis en début de fichier #include "ProjetB.h" (c'est le .h du fichier .c où j'ai déclaré ma structure feuilleScore))

struct Joueur { 
char* nom; 
int nblancerRestants; 
int Des [5]; //les dés du joueur (5 dés) 
struct FeuilleScore; 
}; 


Le but est de créer le bon nombre de structures Joueur (une pour chaque joueurs de la partie).

j'ai donc fait cette petite fonction :

struct Joueur* nombreJoueurs(void){ 
 int nombreJoueurs; 
 printf("Combien de joueurs vont participer a la partie ? (1/2/3/...)"); 
 scanf("%d",&nombreJoueurs); 
    struct Joueur* tab; 
    tab = malloc(sizeof(tab) * nombreJoueurs); 
    return tab; 
} 

jusque là pas de problèmes.
Puis j'ai fais une fonction qui permet d'associer a chaque structures Joueurs le nom du joueur

void nomJoueurs (struct Joueur * tab) { 
    int i = 0; 
    for(i;i<sizeof(tab);i++){ 
        printf("Nom du joueur %d ? ",i+1); 
        scanf("%s",tab[i].nom); 
    } 
} 


sauf qu'a partir de là ... ça ne marche plus du tout, peut importe le nombre de joueurs , mon nomJoueurs me propose toujours le nom de deux joueurs a mètre, et ensuite windows me dit que mon programme a cessé de fonctionner.

Je pense donc que le problème vient de mon allocation dynamique de ma structure. Dois-je faire la même chose pour la structure FeuilleScore qui est dans la structure Joueur ?

Merci d'avance

5 réponses

Bonjour

Si tu veux allouer une structure par joueur, il faut te baser sur la taille de la structure, pas celle du pointeur !
tab = malloc(sizeof(tab) * nombreJoueurs); à remplacer par
tab = malloc(sizeof(struct Joueur) * nombreJoueurs);

Pour ta boucle sur les joueurs, ton for(i;i<sizeof(tab);i++) ne risque pas de fonctionner.sizeof(tab), c'est la taille de la variable tab en octets, qi n'a aucun rapport avec le nombre de joueurs. Il faut rendre la globale la variable nombreJoueurs et faire for(i;i<nombreJoueurs;i++)
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
11 mai 2011 à 14:16
C'est moi qui ais manqué quelques chose ou il manque aussi un malloc pour le nom du joueur ?
0
D'accord avec toi Char Snipeur.
Pour mon info (je ne suis pas spécialiste en C) : dans la déclaration de la struct Joueur, il ne manquerait pas un nom pour le dernier champ struct FeuilleScore ? Car je ne vois pas comment y accéder
0