Probleme de erreur de segmentation
Kenshin87
Messages postés
38
Statut
Membre
-
Kenshin87 Messages postés 38 Statut Membre -
Kenshin87 Messages postés 38 Statut Membre -
Bonjour,
Je vous remercie de votre attention.
Voila, j'ai un gros soucie de segmentation fault que je n'arrive pas à résoudre depuis un bon bout de temps et je vous serais reconnaissant de bien vouloir m'aider.
J'utilise des structure de type :
typedef struct cour
{
char nom [15];
char prenom [15];
int dossard ;
int t_cumule ;
}coureur;
typedef struct elem
{
coureur donnee;
struct elem* suiv;
}element;
typedef struct list
{
element* debut;
element* fin;
element* courant;
}liste;
et à chaque fois que j'utilise des pointeurs du genre :
while (p_liste->courant->suiv != NULL) ou liste_init->debut = NULL ,... j'ai une erreur de segmentation.
Je les utilise dans des différentes fonctions.
Voici mon code au complet : (la fonction principal n'est pas fini, c'est juste pour tester qu'il n'y a pas d'erreur)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cour
{
char nom [15];
char prenom [15];
int dossard ;
int t_cumule ;
}coureur;
typedef struct elem
{
coureur donnee;
struct elem* suiv;
}element;
typedef struct list
{
element* debut;
element* fin;
element* courant;
}liste;
void init_liste (liste* liste_init);
void inserer_coureur (coureur p_coureur, liste* p_liste);
void aller_debut (liste* p_liste);
void avancer (liste* p_liste);
void fin (liste* p_liste);
element coureur_courant (liste* p_liste);
void effacer_courant (liste* p_liste);
void affiche_liste (liste* p_liste);
coureur* creer_coureur ();
int ajouter_temps ( coureur* n_coureur );
void affiche_coureur ( coureur* a_coureur );
coureur* creer_coureur (void)
{
coureur* nouveau;
nouveau = malloc (sizeof (coureur));
printf ("entrer le nom du coureur\n");
scanf ("%s",nouveau->nom);
printf ("entre le prenom du coureur\n");
scanf ("%s",nouveau->prenom);
printf ("entrer le numero du dossard\n");
scanf ("%d",&(nouveau->dossard));
nouveau->t_cumule = 0;
return nouveau;
}
int ajouter_temps ( coureur* n_coureur )
{
int val_jour;
printf ("entrer le temps de l'etape du jour en seconde\n");
scanf ("%d",&val_jour);
return (n_coureur->t_cumule) = (n_coureur->t_cumule) + (val_jour);
}
void affiche_coureur ( coureur* a_coureur )
{
int heure=0, minute=0, seconde=0;
heure = (a_coureur->t_cumule) / 3600 ;
minute = ( (a_coureur->t_cumule) - (heure * 3600 ) ) / 60;
seconde = (a_coureur->t_cumule) - ( (heure * 3600)+(minute * 60) );
printf ("\nnom : %s\nprenom : %s\ndossard : %d\ntemps cumule : %dh %dm %ds\n",a_coureur->nom,a_coureur->prenom,a_coureur->dossard,heure,minute,seconde);
}
void init_liste (liste* liste_init)
{
liste_init->debut = NULL;
liste_init->fin = NULL;
//liste_init->courant = NULL;
}
/*insertion en queue de liste */
void inserer_coureur (coureur p_coureur, liste* p_liste)
{
element* nouveau;
nouveau = (element*) malloc(sizeof(element));
nouveau->suiv=NULL;
nouveau->donnee=p_coureur;
if (p_liste->debut == NULL)
{
nouveau->suiv=p_liste->debut ;
nouveau->donnee=p_coureur;
p_liste->debut = nouveau;
}
else
{
while (p_liste->courant->suiv != NULL)
{
p_liste->courant = p_liste->courant->suiv;
/*mise a jour champs*/
nouveau->suiv = p_liste->courant->suiv;
nouveau->donnee = p_coureur;
/*mise a jour de la queue*/
p_liste->courant->suiv=nouveau;
}
}
}
void aller_debut (liste* p_liste)
{
if (p_liste!=NULL)
{
p_liste->fin = p_liste->debut->suiv;
}
}
void avancer (liste* p_liste)
{
if ( (p_liste!=NULL)&&(p_liste->fin!=NULL) )
{
p_liste->fin = p_liste->fin->suiv;
}
}
void fin (liste* p_liste)
{
if (p_liste!=NULL)
{
if (p_liste->fin->suiv != NULL)
printf ("vous n etes pas a la fin de la liste\n");
else
printf ("vous etes a la fin de la liste\n");
}
}
element coureur_courant (liste* p_liste)
{
element* courant;
courant = (element*) malloc(sizeof(element));
courant = p_liste->courant;
return *courant;
}
void effacer_courant (liste* p_liste)
{
element *supp_element;
supp_element = p_liste->courant;
supp_element->suiv = p_liste->courant->suiv;
free (supp_element);
p_liste->courant = p_liste->courant->suiv;
}
void affiche_liste (liste* p_liste)
{
p_liste->courant = p_liste->debut;
int heure=0, minute=0, seconde=0;
while (p_liste->courant->suiv != NULL)
{
affiche_coureur ( &(p_liste->courant->donnee) );
p_liste->courant = p_liste->courant->suiv;
}
}
int main (void)
{
liste n_liste;
coureur* p_coureur;
p_coureur = creer_coureur ();
p_coureur->t_cumule = ajouter_temps ( p_coureur );
init_liste (&n_liste);
affiche_liste ( &n_liste );
system ("pause");
return 0;
}
Je vous remercie de votre attention!
Je vous remercie de votre attention.
Voila, j'ai un gros soucie de segmentation fault que je n'arrive pas à résoudre depuis un bon bout de temps et je vous serais reconnaissant de bien vouloir m'aider.
J'utilise des structure de type :
typedef struct cour
{
char nom [15];
char prenom [15];
int dossard ;
int t_cumule ;
}coureur;
typedef struct elem
{
coureur donnee;
struct elem* suiv;
}element;
typedef struct list
{
element* debut;
element* fin;
element* courant;
}liste;
et à chaque fois que j'utilise des pointeurs du genre :
while (p_liste->courant->suiv != NULL) ou liste_init->debut = NULL ,... j'ai une erreur de segmentation.
Je les utilise dans des différentes fonctions.
Voici mon code au complet : (la fonction principal n'est pas fini, c'est juste pour tester qu'il n'y a pas d'erreur)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cour
{
char nom [15];
char prenom [15];
int dossard ;
int t_cumule ;
}coureur;
typedef struct elem
{
coureur donnee;
struct elem* suiv;
}element;
typedef struct list
{
element* debut;
element* fin;
element* courant;
}liste;
void init_liste (liste* liste_init);
void inserer_coureur (coureur p_coureur, liste* p_liste);
void aller_debut (liste* p_liste);
void avancer (liste* p_liste);
void fin (liste* p_liste);
element coureur_courant (liste* p_liste);
void effacer_courant (liste* p_liste);
void affiche_liste (liste* p_liste);
coureur* creer_coureur ();
int ajouter_temps ( coureur* n_coureur );
void affiche_coureur ( coureur* a_coureur );
coureur* creer_coureur (void)
{
coureur* nouveau;
nouveau = malloc (sizeof (coureur));
printf ("entrer le nom du coureur\n");
scanf ("%s",nouveau->nom);
printf ("entre le prenom du coureur\n");
scanf ("%s",nouveau->prenom);
printf ("entrer le numero du dossard\n");
scanf ("%d",&(nouveau->dossard));
nouveau->t_cumule = 0;
return nouveau;
}
int ajouter_temps ( coureur* n_coureur )
{
int val_jour;
printf ("entrer le temps de l'etape du jour en seconde\n");
scanf ("%d",&val_jour);
return (n_coureur->t_cumule) = (n_coureur->t_cumule) + (val_jour);
}
void affiche_coureur ( coureur* a_coureur )
{
int heure=0, minute=0, seconde=0;
heure = (a_coureur->t_cumule) / 3600 ;
minute = ( (a_coureur->t_cumule) - (heure * 3600 ) ) / 60;
seconde = (a_coureur->t_cumule) - ( (heure * 3600)+(minute * 60) );
printf ("\nnom : %s\nprenom : %s\ndossard : %d\ntemps cumule : %dh %dm %ds\n",a_coureur->nom,a_coureur->prenom,a_coureur->dossard,heure,minute,seconde);
}
void init_liste (liste* liste_init)
{
liste_init->debut = NULL;
liste_init->fin = NULL;
//liste_init->courant = NULL;
}
/*insertion en queue de liste */
void inserer_coureur (coureur p_coureur, liste* p_liste)
{
element* nouveau;
nouveau = (element*) malloc(sizeof(element));
nouveau->suiv=NULL;
nouveau->donnee=p_coureur;
if (p_liste->debut == NULL)
{
nouveau->suiv=p_liste->debut ;
nouveau->donnee=p_coureur;
p_liste->debut = nouveau;
}
else
{
while (p_liste->courant->suiv != NULL)
{
p_liste->courant = p_liste->courant->suiv;
/*mise a jour champs*/
nouveau->suiv = p_liste->courant->suiv;
nouveau->donnee = p_coureur;
/*mise a jour de la queue*/
p_liste->courant->suiv=nouveau;
}
}
}
void aller_debut (liste* p_liste)
{
if (p_liste!=NULL)
{
p_liste->fin = p_liste->debut->suiv;
}
}
void avancer (liste* p_liste)
{
if ( (p_liste!=NULL)&&(p_liste->fin!=NULL) )
{
p_liste->fin = p_liste->fin->suiv;
}
}
void fin (liste* p_liste)
{
if (p_liste!=NULL)
{
if (p_liste->fin->suiv != NULL)
printf ("vous n etes pas a la fin de la liste\n");
else
printf ("vous etes a la fin de la liste\n");
}
}
element coureur_courant (liste* p_liste)
{
element* courant;
courant = (element*) malloc(sizeof(element));
courant = p_liste->courant;
return *courant;
}
void effacer_courant (liste* p_liste)
{
element *supp_element;
supp_element = p_liste->courant;
supp_element->suiv = p_liste->courant->suiv;
free (supp_element);
p_liste->courant = p_liste->courant->suiv;
}
void affiche_liste (liste* p_liste)
{
p_liste->courant = p_liste->debut;
int heure=0, minute=0, seconde=0;
while (p_liste->courant->suiv != NULL)
{
affiche_coureur ( &(p_liste->courant->donnee) );
p_liste->courant = p_liste->courant->suiv;
}
}
int main (void)
{
liste n_liste;
coureur* p_coureur;
p_coureur = creer_coureur ();
p_coureur->t_cumule = ajouter_temps ( p_coureur );
init_liste (&n_liste);
affiche_liste ( &n_liste );
system ("pause");
return 0;
}
Je vous remercie de votre attention!
A voir également:
- Probleme de erreur de segmentation
- Erreur upes 1025 - Forum Téléviseurs
- Erreur t32 ✓ - Forum Livebox
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
- Erreur 0x80070643 - Accueil - Windows
- Corriger l'erreur 0x80070643 de la mise à jour KB5034441 de Windows 10 - Accueil - Windows
17 réponses
ben à chaque fois que j'utilise des pointeurs du genre :
while (p_liste->courant->suiv != NULL) ou liste_init->debut = NULL ,... j'ai une erreur de segmentation.
while (p_liste->courant->suiv != NULL) ou liste_init->debut = NULL ,... j'ai une erreur de segmentation.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
tu ne mais pas "p_liste->courant->suiv=NULL " au deput de creation de ton liste chaine
si tu ne compri pas repant moi?
si tu ne compri pas repant moi?
Je n'ai pas compris.
Pourquoi nouveau =(coureur*) malloc (sizeof (coureur)); et non nouveau =(element*) malloc (sizeof (element));
Mettre p_liste->courant->suiv=NULL " au deput de creation de ton liste chaine, de quelle liste chaine parles-tu?
Pourquoi nouveau =(coureur*) malloc (sizeof (coureur)); et non nouveau =(element*) malloc (sizeof (element));
Mettre p_liste->courant->suiv=NULL " au deput de creation de ton liste chaine, de quelle liste chaine parles-tu?
Je te remercie pour ton attention!
J'ai cherché pendant des heures mais je n'ai toujours pas réussi.
C'est peut-être du fait qu'un pointeur ne peut allouer de la mémoire que pour lui même, or je demande encore de la mémoire dans ce qu'il pointe avec p_liste->courant->suiv=NULL, ...
J'ai cherché pendant des heures mais je n'ai toujours pas réussi.
C'est peut-être du fait qu'un pointeur ne peut allouer de la mémoire que pour lui même, or je demande encore de la mémoire dans ce qu'il pointe avec p_liste->courant->suiv=NULL, ...
j'ai une quistion :
tu a fait une structure de liste chaine mais tu n'a pas boucler au niveau de creation de cette liste
la creation se fait une seul foit
et verifier que tu a au dernier neoud "(....)->next=NULL"
voila ton main
int main (void)
{
liste n_liste;
coureur* p_coureur;
p_coureur = creer_coureur (); // creation une suel fois
p_coureur->t_cumule = ajouter_temps ( p_coureur );
init_liste (p_coureur,n_liste);
affiche_liste ( n_liste );// puis tu fais une affichge
system ("pause");
return 0;
}
tu a fait une structure de liste chaine mais tu n'a pas boucler au niveau de creation de cette liste
la creation se fait une seul foit
et verifier que tu a au dernier neoud "(....)->next=NULL"
voila ton main
int main (void)
{
liste n_liste;
coureur* p_coureur;
p_coureur = creer_coureur (); // creation une suel fois
p_coureur->t_cumule = ajouter_temps ( p_coureur );
init_liste (p_coureur,n_liste);
affiche_liste ( n_liste );// puis tu fais une affichge
system ("pause");
return 0;
}
J'ai fais ce main juste pour vérifier qu'il n'y a pas de problème.
Je voulais juste vérifier que affiche_liste ( n_liste ) marche, que j'arrive à afficher la liste avec un seul coureur.
En effet, il y a eu ce problème de segmentation fault.
Puis après le dois faire un menu etc... mais pour le moment, je suis complètement bloqué à cause de ce segmentation fault.
Je voulais juste vérifier que affiche_liste ( n_liste ) marche, que j'arrive à afficher la liste avec un seul coureur.
En effet, il y a eu ce problème de segmentation fault.
Puis après le dois faire un menu etc... mais pour le moment, je suis complètement bloqué à cause de ce segmentation fault.
Le but du programme est d'avoir les informations des coureurs (nom, prénom, numéro, temps mis par le coureur....) et de les classer du plus performants au moins performant à l'aide d'une liste.