C++ erreur de segmentation
Pierre
-
Jon301 -
Jon301 -
Bonjour,
je me suis fait un ptit programme :
--------------
int main()
{
int nbeleves;
int nbnotes;
float total = 0;
float moy;
cout << "Combien avez-vous d'élèves ?\n";
cin >> nbeleves;
cout << "\nCombien y a t-il de notes par élève ?\n";
cin >> nbnotes;
struct eleve
{
float note[];
string prenom, nom;
};
eleve eleve_no[40];
cout << "\n\nOK ...\n";
for(int i=0;i<nbeleves;i++)
{
cout << "\nEntrez le prénom de l'élève " << i+1 << " :\n";
cin >> eleve_no[i].prenom;
cout << "\n\nEntrez le nom de cet élève :\n";
cin >> eleve_no[i].nom;
for(int a=0;a<nbnotes;a++)
{
cout << "\nEntrez la note " << a+1 << " :\n";
cin >> eleve_no[i].note[a];
}
return 0;
}
}
---------------
Il marche parfaitement, mais à la fin il me dis "erreur de segmentation ".
Je ne vois pas pourquoi ?
je me suis fait un ptit programme :
--------------
int main()
{
int nbeleves;
int nbnotes;
float total = 0;
float moy;
cout << "Combien avez-vous d'élèves ?\n";
cin >> nbeleves;
cout << "\nCombien y a t-il de notes par élève ?\n";
cin >> nbnotes;
struct eleve
{
float note[];
string prenom, nom;
};
eleve eleve_no[40];
cout << "\n\nOK ...\n";
for(int i=0;i<nbeleves;i++)
{
cout << "\nEntrez le prénom de l'élève " << i+1 << " :\n";
cin >> eleve_no[i].prenom;
cout << "\n\nEntrez le nom de cet élève :\n";
cin >> eleve_no[i].nom;
for(int a=0;a<nbnotes;a++)
{
cout << "\nEntrez la note " << a+1 << " :\n";
cin >> eleve_no[i].note[a];
}
return 0;
}
}
---------------
Il marche parfaitement, mais à la fin il me dis "erreur de segmentation ".
Je ne vois pas pourquoi ?
A voir également:
- C++ erreur de segmentation
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Java code erreur 1603 ✓ - Forum Windows
5 réponses
Salut Pierre,
Quand tu as le segmentation fault quelles sont les valeurs de nbeleves et nbnotes?
Selon ces valeurs tes boucles for sont mal construites car tu incrémentes les variables de tes boucles for (i et a) 2 fois et tu peux donc demander à écrire en dehors de tes tableaux.
stef
Quand tu as le segmentation fault quelles sont les valeurs de nbeleves et nbnotes?
Selon ces valeurs tes boucles for sont mal construites car tu incrémentes les variables de tes boucles for (i et a) 2 fois et tu peux donc demander à écrire en dehors de tes tableaux.
stef
Pierre,
petite correction à mon dernier mesasge, tu incrémentes bien qu'un fois néanmoins si nbeleves> 40 tu écris hors du tableau.
De plus quelle valeur mets tu dans la struct pour note[] ???
Stef
petite correction à mon dernier mesasge, tu incrémentes bien qu'un fois néanmoins si nbeleves> 40 tu écris hors du tableau.
De plus quelle valeur mets tu dans la struct pour note[] ???
Stef
Bonjours,
Je pense que cela vient du fait que tu ne définis pas un nombre max de notes par élève.
Par ailleurs ton "return 0;" est assez curieusement placé.
a+
eric
Je pense que cela vient du fait que tu ne définis pas un nombre max de notes par élève.
Par ailleurs ton "return 0;" est assez curieusement placé.
a+
eric
Merci pour vos réponse, pour le "return 0" c ke javais pas copier mon message en eniter dc je l'ai rajouté sans faire attention .
J'ai essayé ca chez moi et ca fonctionne bien...
struct eleve {
float *note;
string prenom, nom;
};
eleve eleve_no[40];
int main() {
int nbeleves;
int nbnotes;
float total = 0;
cout << "Combien avez-vous d'élèves ?\n";
cin >> nbeleves;
cout << "\nCombien y a t-il de notes par élève ?\n";
cin >> nbnotes;
for (int j=0; j<40; j++) {
eleve_no[j].note = new float(nbnotes);
}
cout << "\n\nOK ...\n";
for(int i=0;i<nbeleves;i++) {
cout << "\nEntrez le prénom de l'élève " << i+1 << " :\n";
cin >> eleve_no[i].prenom;
cout << "\n\nEntrez le nom de cet élève :\n";
cin >> eleve_no[i].nom;
for(int a=0;a<nbnotes;a++) {
cout << "\nEntrez la note " << a+1 << " :\n";
cin >> eleve_no[i].note[a];
}
}
return 0;
}
struct eleve {
float *note;
string prenom, nom;
};
eleve eleve_no[40];
int main() {
int nbeleves;
int nbnotes;
float total = 0;
cout << "Combien avez-vous d'élèves ?\n";
cin >> nbeleves;
cout << "\nCombien y a t-il de notes par élève ?\n";
cin >> nbnotes;
for (int j=0; j<40; j++) {
eleve_no[j].note = new float(nbnotes);
}
cout << "\n\nOK ...\n";
for(int i=0;i<nbeleves;i++) {
cout << "\nEntrez le prénom de l'élève " << i+1 << " :\n";
cin >> eleve_no[i].prenom;
cout << "\n\nEntrez le nom de cet élève :\n";
cin >> eleve_no[i].nom;
for(int a=0;a<nbnotes;a++) {
cout << "\nEntrez la note " << a+1 << " :\n";
cin >> eleve_no[i].note[a];
}
}
return 0;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pierre,
Lorsque tu as un segmentation fault, c'est souvent une erreur d'indice dans un tableau
Ici, tu as saisi le nombre de note par eleve, mais dans ta structure tu n'as pas donné de taille pour le tableau de note.
(float note[]; n'est pas correct).
Etant donné que la taille d'un tableau doit être une constante et que ca fait pas propre de faire une saisie de la taille de cette manière,
il faudrait que tu déclares un pointeur et que tu alloue dynamiquement un tableau de nbnotes
float* note;
note = new float[nbnote];
en gros, comme ce qu'a fait stef ci dessus
voila.
Jon
Lorsque tu as un segmentation fault, c'est souvent une erreur d'indice dans un tableau
Ici, tu as saisi le nombre de note par eleve, mais dans ta structure tu n'as pas donné de taille pour le tableau de note.
(float note[]; n'est pas correct).
Etant donné que la taille d'un tableau doit être une constante et que ca fait pas propre de faire une saisie de la taille de cette manière,
il faudrait que tu déclares un pointeur et que tu alloue dynamiquement un tableau de nbnotes
float* note;
note = new float[nbnote];
en gros, comme ce qu'a fait stef ci dessus
voila.
Jon