Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 13h08   #1
Elminthor
Invité de passage
 
Administrateur systèmes et réseaux
Inscription : octobre 2012
Messages : 18
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux

Informations forums :
Inscription : octobre 2012
Messages : 18
Points : 0
Points : 0
Par défaut segmentation (core dumped)

bonjour,
voilà dans le cadre d'un TP pour un de mes profs, j'ai ce petit code qui permet d'ajouter des étudiants, de les afficher, d'en supprimer, et de faire un calcul de moyenne.

Néanmoins je me retrouve avec un problème de segmentation ( core dumped ) lorsque je tente un affichage. Je n'arrive pas a trouver l'erreur, c'est pourquoi je me tourne aujourd'hui vers vous =)

voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
 
#include <stdio.h>
#include <stdlib.h>
 
struct etudiant
{
  char *nom;
  float moy;
  int num;
  struct etudiant *suivant;
  struct etudiant *precedent;
};
 
typedef struct etudiant Etudiant;
 
 
 
Etudiant *ajout(Etudiant *etudiant)
{
  Etudiant *temp;
 
      etudiant->nom=(char*)malloc(sizeof(char));
      printf("Saisir le nom de l'étudiant : ");
      scanf("%s", etudiant->nom);
      printf("Saisir le matricule de l'étudiant : ");
      scanf("%d", &etudiant->num);
      printf("Saisir la moyenne de l'étudiant : ");
      scanf("%f", &etudiant->moy);
	etudiant->suivant=(Etudiant*)malloc(sizeof(Etudiant));
	temp = etudiant;
	etudiant=etudiant->suivant;
	etudiant->precedent=temp;
  return (etudiant);
}
 
Etudiant *supprimer(Etudiant *etudiant)
{
  int num = 1;
  Etudiant *temp;
  while (num != 0)
    {
      printf("Saisissez le numéro de matricule de l'étudiant absent à supprimer (0 pour terminer) : ");
      scanf("%d", &num);
      if (num != 0)
	  {
		while (etudiant->suivant && (etudiant->num != num))
		{
			etudiant = etudiant->suivant; 	// on parcourt jusqu'à ce qu'on tombe sur un élément avec le numéro qui match (ou jusqu'à la fin)
		}
			if (etudiant->num != num)		// si on a rien trouvé
			{
				printf("élément introuvable");
			}
			else
			{
				if (etudiant->precedent && etudiant->suivant) // suppression d'un élément normal
					{
						temp = etudiant->precedent;
						temp->suivant = etudiant->suivant;	// on prend l'élément suivant de la cellule précédente (soit la cellule actuelle) et on le remplace par l'élément suivant de la cellule actuelle
						temp = etudiant->suivant;
						temp->precedent = etudiant->precedent;	// pareil, mais de l'autre côté. Ainsi, la cellule à supprimer ne fait plus partie de la liste
						etudiant = etudiant->suivant;
					}
				else
				{
					if (etudiant->precedent==NULL) //cas du premier élément
					{
						etudiant = etudiant->suivant;
						etudiant->precedent = 0;
					}
					if (etudiant->suivant==NULL) //cas du dernier élément
					{
						etudiant = etudiant->precedent;
						etudiant->suivant = 0;
					}
				}    
			}
		while (etudiant->precedent)
			etudiant = etudiant->precedent;
		}
	}
  return (etudiant);
}
 
 
void promo_finale(Etudiant *etudiant)
{
  // suppression des étudiants dont la moyenne est < 12
  while (etudiant->suivant)
    {
      if (etudiant->moy < 12)
	supprimer(etudiant);
      etudiant = etudiant->suivant;
    }
  while (etudiant->precedent)	// on revient au début (pour l'appel de "afficher")
      etudiant = etudiant->precedent;
}
 
void afficher(Etudiant *etudiant)
{
  while (etudiant->suivant)
    {
      printf("Matricule étudiant : %s\n", etudiant->num);
      printf("Nom étudiant : %f\n", etudiant->nom);
      printf("Moyenne étudiant : %d\n", etudiant->moy);
	  printf("\n");
      etudiant = etudiant->suivant;
    }
}
 
void main()
{
	Etudiant *etudiant = (Etudiant*)malloc(sizeof(Etudiant));
	Etudiant *premier;
	int i = 0;
	int rep;
	do
	{
		printf("\n\n");
		printf(" ________________________________________________________________________|\n");
		printf("| GEStIONAIRE ETUDIANT							 |\n");
		printf("|________________________________________________________________________|\n");
		printf("| 1	-	ajouter un element a la fin de la liste			 |\n");
		printf("| 2	-	Affichage de la liste					 |\n");
		printf("| 3	-	Suppression						 |\n");
		printf("| 4     -	Obtenir la promotion finale				 |\n");
		printf("| 0	-	QUITTER							 |\n");
		printf("|________________________________________________________________________|\n");
		printf("| donner le numero de votre choix		 			 |\n");
		printf("|________________________________________________________________________|\n\n");
		scanf("%d",&rep);
 
		switch(rep)
		{
			case 1: etudiant=ajout(etudiant);
			i++;
			if (i==1)
			{
				premier = etudiant->precedent;
				premier->suivant=etudiant;
			}
			break;
			case 2:if (premier==NULL)
			printf("la liste est vide vous devez la remplir");
			else
			afficher(premier);
			break;
			case 3:
			premier=supprimer(premier);
			case 4:
			promo_finale(premier);
		}
	}
	while(rep!=0);
}
Elminthor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h36   #2
JeitEmgie
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 375
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 375
Points : 2 891
Points : 2 891
au minimum :

ligne 22 : allocation d'un buffer de 1 char, insuffisant pour contenir une string terminée par '\0'

ligne 24 : utilisation de scanf donc pas de vérification de longueur par rapport au buffer alloué

ligne 31 et suivante : le "suivant" du nouveau record n'est pas initialisé à NULL


votre logique de gestion de la liste est bancale : vous avez toujours un étudiant non initialisé correctement
que ce soit le premier quand vous n'avez pas encore ajouter un nouveau ou le dernier quand vous en avez ajouté un ou plusieurs.
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 13h51   #3
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 167
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 167
Points : 12 617
Points : 12 617
Bonjour,

Ajouté à ce qu'à déjà dit JeitEmgie, tu as échangé :

Code :
1
2
printf("Matricule étudiant : %s\n", etudiant->num);
printf("Nom étudiant : %f\n", etudiant->nom);
Et plutôt que de faire une fonction Etudiant *supprimer(Etudiant *etudiant) contenant la saisie du numéro de matricule, fais deux fonctions distinctes :
Code :
1
2
int saisieNumMatricule();
Etudiant *supprimer(Etudiant *etudiant, int numMatricule);
supprimer() qui servira entre autres dans la fonction promo_finale() où la saisie est inutile.

Pense aussi à libérer la mémoire avec free() que ce soit pour supprimer un élève, ou à la fin.

Bonne continuation
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 15h39   #4
Elminthor
Invité de passage
 
Administrateur systèmes et réseaux
Inscription : octobre 2012
Messages : 18
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Activité : Administrateur systèmes et réseaux

Informations forums :
Inscription : octobre 2012
Messages : 18
Points : 0
Points : 0
problème résolu merci a vous deux
Elminthor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h32   #5
Bktero
Expert Confirmé Sénior
 
Avatar de Bktero
 
Ingénieur systèmes embarqués
Inscription : juin 2009
Messages : 1 699
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur systèmes embarqués
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2009
Messages : 1 699
Points : 4 155
Points : 4 155
Merci de cliquer sur le bouton en bas de l'écran dans ce cas
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a

Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^

Pour vos problèmes d'embarqué, utilisez le forum dédié !
Bktero est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h02.


 
 
 
 
Partenaires

Hébergement Web