Faute de Segmentation core dumped...?
Je suis en train de le faire:
Écrire un programme qui accepte les trois entrées de l'utilisateur: attribution de la marque, à mi-parcours de la marque, et de l'examen final
marque.Ces entrées sont de type float et doit avoir des valeurs entre 0 et 100.
Le programme
faut calculer la note finale comme un pourcentage et une lettre de grade.• Les notes finales sont calculés comme: travaux 20%, à mi-parcours De 30%, examen Final 50%. Lettre de grades
sont calculés comme suit: Une (grade ≥ 80%), B (80 > finale de grade ≥ 70%), C (70 > finale de grade ≥ 60%),
D (60 > finale de grade ≥ 50%), et F (50 > note finale).La note finale et la lettre de la catégorie sont affichés.
avec le code suivant:
#include <stdio.h>
int checkMark(int);
float getMark();
float computeFinalGrade(float assign, float midterm, float finalExam, float finalGrade);
int computeLetterGrade(float);
int checkMark(int x)
{
while(x<0 || x>100) //While x is a negative number:
{
printf("Invalid entry.Try again:");
scanf("%d",&x);
}
if(x>0 && x<=100)//If x is a positive number:
x=x;
return x;
}
float getMark(void)
{
float mark=0,assignMark=0,midMark=0,examMark=0,finalMark=0;
char letterGrade;
printf("Enter assignment grade:");
scanf("%d",mark);
checkMark(mark);
assignMark=mark;
printf("\nEnter midterm mark:");
scanf("%f",&mark);
checkMark(mark);
midMark=mark;
printf("\nEnter exam mark:");
scanf("%f",&mark);
checkMark(mark);
examMark=mark;
finalMark=computeFinalGrade(assignMark,midMark,examMark,finalMark);
letterGrade=computeLetterGrade(finalMark);
printf("The final grade for the course is %.1f, and the letter grade is %c.\n",finalMark,letterGrade);
return 0;
}
float computeFinalGrade(float assign, float midterm, float finalExam, float finalGrade)
{
assign=(float)0.2*assign;
midterm=(float)0.3*midterm;
finalExam=(float)0.4*finalExam;
finalGrade=(float)assign+midterm+finalExam;
return finalGrade;
}
int computeLetterGrade(float finalGrade)
{
int grade;
if(finalGrade>=80)
grade=65;
if(finalGrade<80)
if(finalGrade>=70)
grade=66;
if(finalGrade<70)
if(finalGrade>=60)
grade=67;
if(finalGrade<60)
if(finalGrade>=50)
grade=68;
if(finalGrade<50)
grade=70;
return grade;
}
int main()
{
getMark();
return 0;
}
Quand je déboguer le programme ci-dessus et entrez un nombre négatif, il me donne ceci:
Enter assignment grade:123
Segmentation fault (core dumped)
Ce que je fais mal exactement?
- Apprendre à utiliser un débogueur, tels que gnu.org/s/gdb
- Où ça plante? Charger le fichier de base dans le gdb et faire un peu d'analyse post mortem. Ensuite, lorsque vous savez ce que la ligne, il se bloque sur ce sujet est un peu plus facile.
- 123 n'est pas un nombre négatif...
- Je pense que c'est "négative", comme dans le mauvais sens dans ce cas.
- Il dit: "et entrez un nombre négatif" c'est à dire le nombre < 0 ...
Vous devez vous connecter pour publier un commentaire.
C'est votre problème:
Vous avez besoin pour passer l'adresse de la variable, et le sélectionneur devrait être
%f
. Essayez:D'ailleurs, il y a un C FAQ à ce sujet.
gcc -Wall -g yourcode.c -o yourprogram
. Mais vous devriez vraiment apprendre plus!gdb
et vous devriez en apprendre davantage sur la façon d'utilisergcc
. En particulier, vous devez toujours passer-Wall
àgcc
pour votre code. Vous devriez également apprendre à utilisermake
et écrire des programmes dans plusieurs fichiers source. Avoir du plaisir.gdb
ou que je ne compile pas avec des avertissements activé ?Quelques remarques sur ton code:
devrait plutôt être:
Avis que j':
retiré inutile commentaires
retiré de la magie des chiffres (0 et 100)
retiré inutile de test (si vous la sortie de la boucle while, alors x est dans {0, ..., 100}
permis
x
être égale à 0enlevé un idempotent de cession (
x=x
ne pas faire quelque chose d'utile...)Alors:
^ Comme mentionné par d'autres, vous devez utiliser
%f
et&mark
dans cescanf
.^ Ici, il convient de
mark = checkMark(mark);
si vous voulez lemark
variable dans le présent code pour être mis à jour. C'est parce que la valeur demark
est passé à la fonction, pas une référence à la variablemark
. Une autre solution est de passer de cette référence, mais je ne pense pas que vous êtes prêt pour cela encore 🙂^ Mêmes remarques pour toutes ces lignes
^ En passant
finalMark
comme un paramètre ici est complètement inutile. Il faut juste êtrefinalMark = computeFinalGrade(assignMark, midMark, examMark);
, vous ne pensez pas?Comme mentionné plus tôt, vous n'avez pas besoin de passer quelques
finalGrade
de la valeur àcomputeFinalGrade
, vous devriez être bien avec juste un:Enfin, dans
computeLetterGrade
, vous faites beaucoup de tests redondants, et votre flux de contrôle est gâché par cette affectation de variable, de plus, vous devez utiliser unchar
plutôt qu'unint
. Essayez plutôt ceci:Vous aurez probablement besoin de corriger certaines choses que je n'ai pas mentionné, mais au moins vous devriez être au plus près de vos objectifs avec certaines de ces corrections.
Si vous êtes sur linux, prendre un coup d'oeil à ma réponse ici. C'est à propos de valgrind, un outil qui permet le débogage des erreurs de segmentation, des fuites de mémoire etc.
La Segmentation des défauts se produisent lorsque votre programme tente d'accéder à une zone de mémoire à l'extérieur de celle attribuée à votre programme.
scanf()
s'attend à une adresse de la variable. Dans votre code, vous avez passé la variable de la valeur àscanf()
au lieu de son adresse, ainsi que l'a souligné cnicutar.La marque de la variable n'est pas initialisée et a des données aléatoires, qui est considérée comme un emplacement de la mémoire par le scanf et lorsqu'il tente d'écrire à cette adresse... erreur de Segmentation se produit en raison de l'accès limité de la mémoire. Aussi, la marque est variable de type float, et donc vous devriez utiliser
%f
spécificateur..