|
|
|
|
Bonjour,
Je recois lors du test de mon programme une erreur du type "segmentation fault" et je n'arrive absolument pas à voir d'où elle sort, toute aide sera appréciable.
Ce programme contient deux structures dont une inclue l’autre, l’idée est de réaliser un annuaire, on demande le nom, prénom et numéro de plusieurs personnes, que l’on stock dans la structure Personne. On prend ensuite 20 personnes de cette structure pour les mettre dans un carnet. Le carnet contient un second champ qui est le nombre de personnes présentes dans le carnet correspondant, autrement dit 20 si on avait bien 20 personnes dans la structure Personne.
Voici le programme:
#include <stdio.h>
struct Personne {
char nom[32];
char prenom[32];
char numero[13];
};
struct Carnet {
struct Personne pc[20];
int nb_de_personnes;
};
struct Personne nouv_personne(char *nom,char *prenom,char *numero){
struct Personne p;
strcpy(p.nom,nom);
strcpy(p.prenom,prenom);
strcpy(p.numero,numero);
return (p);
}
struct Carnet ajout_ds_carnet(int i, char *nom, char *prenom, char *numero){
struct Carnet c;
strcpy(c.pc[i].nom,nom);
strcpy(c.pc[i].prenom,prenom);
strcpy(c.pc[i].numero,numero);
c.nb_de_personnes++;
return (c);
}
main(){
int i,j=0;
for (i=0; i<5; i++){ //On demande d’entrer seulement 5 personnes
if (i==20) { i=0; j++; }
struct Personne p[i];
char nom[32],prenom[32],numero[13];
printf("Entrez le nom du %d:",i); scanf("%s",nom);
printf("Entrez le prenom du %d:",i); scanf("%s",prenom);
printf("Entrez le numero du %d:",i); scanf("%s",numero);
p[i] = (*nouv_personne)(nom, prenom, numero);
printf("(%s, %s, %s) a été ajouté à la structure Personne\n",p[i].nom,p[i].prenom,p[i].numero);
struct Carnet c[j]; /* Le problème se situe à partir de cette ligne */
c[j] = (*ajout_ds_carnet)(i, p[i].nom, p[i].prenom, p[i].numero);
printf("\nCarnet n°%d, ligne n°%d contient: ((%s,%s,%s),%d)",j,i+1,c[j].pc[i].nom,c[j].pc[i].prenom,c[j].pc[i].numero,c[j].nb_de_personnes);
}
Configuration: Windows XP Firefox 2.0.0.1
Quand tu alloue un élé ment à une structure, tableau, variable, etc.. i lfaut allouer également l'espace nécessaire. Pour les variables et autres trucs simple c'est fait tout seul, mais pour ce qui est des structures, tu dois impérativement allouer l'espace mémoire nécéssaire au stockage de tes données.Ainsi, lorsque tu fais dans ta fonction d'ajout de personne :
struct Personne p;
strcpy(p.nom,nom);
strcpy(p.prenom,prenom);
strcpy(p.numero,numero);
return (p);
Tu n'alloue pas de mémoire à ton élément 'p', si bien que le prog ne peut rien copier dans ton élément p. Idem pour ce qui est de l'ajout dans ton annuaire, sauf que là il te fais une erreur car tu accede directement à un espace non alloué comme suit : strcpy(c.pc[i].nom,nom); lorsque tu fais 'c.pc[i].nom', c.pc[i] est sensé etre alloué, ce qui n'est pas ton cas. Donc il te faut allouer l'espace mémoire avant d'utiliser ta structure, de meme pour les tableaux, ainsi ton main devient :
main(){
int i,j=0;
// --- ICI TU ALLOUE TON TABLEAU POUR 5 PERSONNES
struct Personne *p = malloc ( 5 * sizeof( Personne ) );
struct Carnet *c = null;
for (i=0; i<5; i++){ //On demande d’entrer seulement 5 personnes
if (i==20) { i=0; j++; }
// --- Comme ca ici tu peux utiliser correctement :
struct Personne p[i];
char nom[32],prenom[32],numero[13];
printf("Entrez le nom du %d:",i); scanf("%s",nom);
printf("Entrez le prenom du %d:",i); scanf("%s",prenom);
printf("Entrez le numero du %d:",i); scanf("%s",numero);
p[i] = (*nouv_personne)(nom, prenom, numero);
printf("(%s, %s, %s) a été ajouté à la structure Personne\n",p[i].nom,p[i].prenom,p[i].numero);
c = calloc ( sizeof( Carnet ));
c[j] = (*ajout_ds_carnet)(i, p[i].nom, p[i].prenom, p[i].numero);
printf("\nCarnet n°%d, ligne n°%d contient: ((%s,%s,%s),%d)",j,i+1,c[j].pc[i].nom,c[j].pc[i].prenom,c[j].pc[i].numero,c[j].nb_de_personnes);
}
La fonction malloc permet d'allouer une taille fixe à un moment donné, et la fonction calloc (si mes souvenir sont bons, je n'ai pas vérifié) permet d'allouer sur le moment un espace, donc utile ici pour allouer une case de pllus à chaque passage. PS : il te faut aussi modifier tes fonctions en allouant la mémoire nécessaire à chaque structure que tu créé au départ, mais je te laisse le soin de le faire pour voir si tu as compris ou pas ;) --@ droate, iclic, iclic et ya pas de bôg môsieu ! ~
|