Archi-debutant segfault sur petit programme :-( [ C ] - C - Programmation
Marsh Posté le 15-03-2005 à 13:50:15
NiQoZ1 a écrit : Mon programme (un petit exo que j'avait fait en perl que je refait en C pour m'apprendre) fonctionne mais il ya une erreur de segmentation des que je le quitte. |
Donc il ne fonctionne pas.
Citation : Que veut dire ce genre de backtrace ??
|
Rien il faut poster le code.
Marsh Posté le 15-03-2005 à 14:00:02
tu a tout a fait raison.
C'est un programme tout simple de calcul de moyenne le programme demande le prenom et une note en boucle jusqu'a la saisie de 'q' et renvoi les moyennes des prenoms. On peut rentrer plusieur fois le même prenom (c'est la seule difficulté...enfin pour moi).
Code :
|
Je suis sous linux pour info... Je reprécise que je débute en programmation et c'est mon premier programme en c.
Marsh Posté le 15-03-2005 à 14:12:56
scanf("%s", prenom);
beurk, utilise fgets
# if ((ptr = strcpy(un_prenom, prenom)) == NULL) {
# perror("strcpy!" );
# exit(1);
# }
tu peux t'accrocher là ... tu nous appelle si ça arrive un jour
tab_notes[j] = '0';
'0' != '\0'
(test = strcmp(prenom, listprenoms[j])) == NULL
man strcmp
Marsh Posté le 15-03-2005 à 14:23:05
Merci de donner de ton temp.
# if ((ptr = strcpy(un_prenom, prenom)) == NULL) {
# perror("strcpy!" );
# exit(1);
# }
comment effecturait tu la copie alors ?
même question pour la comparaison strcmp.
Marsh Posté le 15-03-2005 à 14:25:48
man strcpy
man strcmp
tu te vautres complet sur les valeurs de retour
Marsh Posté le 15-03-2005 à 14:31:06
NiQoZ1 a écrit : |
strcmp() retourne un int et non un pointeur. Lire la doc.
Marsh Posté le 15-03-2005 à 14:31:19
(test = strcmp(prenom, listprenoms[j])) == NULL)
serai:
(test = strcmp(prenom, listprenoms[j])) == '0')
mais ça ne fonctionne plus à la comparaison ...
Marsh Posté le 15-03-2005 à 14:37:08
strcmp prend deux pointeurs en parametre.. est ce là mon erreur car moi c'est des tableau de catactere (chaines)...
Mais je croyai qu'une chaine de caractère etait un pointeur sur le premier caractere ?
Marsh Posté le 15-03-2005 à 14:46:34
bon j'ai compris mon erreur sic...sic( un peu boulet le bonhomme)
donc
(test = strcmp(prenom, listprenoms[j])) == NULL)
devien
(test = strcmp(prenom, listprenoms[j])) == '\0')
et là plus d'erreurs de type mais toujour le segfault à la fin
Marsh Posté le 15-03-2005 à 14:49:50
on va faire comme si j'avais rien lu.
strcmp retourne une valeur < 0, == 0 ou > 0
strcpy(a, b) retourne a
Marsh Posté le 15-03-2005 à 14:53:12
d'accord sorry Taz !
(test = strcmp(prenom, listprenoms[j])) == '0')
mais il ne trouve jamais le prenom ?
Marsh Posté le 15-03-2005 à 15:00:20
pourquoi cette comparaison ne fonctionne pas ?
car man strcmp dit:
-Elle renvoie un entier negatif, nul, ou positif, si s1 est respectivement inferieure, egale ou superieure a s2
donc si mon entier test est nul c'est que la comparaison est égale.
Mais ça ne fonctionne pas...
Je pense que ma chaine comparée doit avoir un retour chariot en trop, ou quelque chose comme ça ?
Marsh Posté le 15-03-2005 à 15:00:55
'0' ce n'est pas 0.
'0' ça doit faire 48 si je ne me trompe pas (Caractère '0').
Marsh Posté le 15-03-2005 à 15:01:50
NiQoZ1 a écrit : d'accord sorry Taz ! |
allez dégage ...
Marsh Posté le 15-03-2005 à 15:03:47
Code :
|
ma comparaison ne fonctionne pas et j'ai un segfault à la fin....
Marsh Posté le 15-03-2005 à 15:07:04
c'est pas la peine d'^etre impoli je debute... vieux j'ai 30 balais et forcément c'est plus dur qua 18...
Donc mon 'strcmp' est faux encore, je n'ai donc toujours pas compris. Et bien désolé.
Marsh Posté le 15-03-2005 à 15:14:02
NiQoZ1 a écrit : c'est pas la peine d'^etre impoli je debute... vieux j'ai 30 balais et forcément c'est plus dur qua 18... |
Remplace ton '0' par 0
Ca ira mieux.
Marsh Posté le 15-03-2005 à 15:16:29
((test = strcmp(prenom, listprenoms[j])) == 0)
voila ca marche pour la comparaison les '' etait en trop.
Mais le segfault est toujour là à la fin.
(effectivement avec les cotes sa change tout)
Marsh Posté le 15-03-2005 à 15:17:45
merci vinx je venai de m'en rendre compte mais j'ai toujour un segfaut à la fin.
Marsh Posté le 15-03-2005 à 15:25:24
(gdb) run
Starting program: /home/gnoniqoz/tmp/a.out
Saissisez le prenom ?
toto
Saississez la note ?
12
Saissisez le prenom ?
q
Prenom = toto
Note moyenne =12.00
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) bt
#0 0x00000000 in ?? ()
(gdb) list
13
14
15 int
16 main(void) {
17 char *listprenoms[MAX];
18 float tab_notes[MAX];
19 short int tab_multi[MAX];
20 float note;
21 char prenom[BIGMAX];
22 unsigned int existe, test, i, j = 0;
(gdb)
Marsh Posté le 15-03-2005 à 15:53:20
NiQoZ1 a écrit : d'accord sorry Taz ! |
On te dit que c'est 0 (la valeur zéro), pas '0' (le caractère 0) ...
|
Marsh Posté le 15-03-2005 à 16:04:57
Code :
|
oui oui, comme ecrit dans les posts précédents les cotes sont enlevées, mais j'ai toujours un segfault.
Marsh Posté le 15-03-2005 à 16:11:49
ce qui est beau sur mon powerpc, c'est que ce joli programme tourne indéfininment, pile corrompue oblige.
char *listprenoms[MAX];
...
for (i = 0; i < BIGMAX; i++) {
listprenoms[i] = NULL;
ça fait plein de jolis trucs
Marsh Posté le 15-03-2005 à 16:17:43
il se moque... Bon alors donc c'est tout faux il faut que je le reprenne totalement ou quelques parties sont "juste" ?
t'en pense quoi monsieur Taz...
Marsh Posté le 15-03-2005 à 16:20:40
en fait je ne sait pas comment effectuer une recherche de chaine dans un tableau de pointeur sur chaine de caractère...
Marsh Posté le 15-03-2005 à 16:21:58
si tu commençais par pendre en compte les remarques, ça serait déjà un grand pas. alors tu corrige ce problème de borne, et tu reprends le topic depuis le début, et tu corriges, surtout les farces genre scanf("%s"
Marsh Posté le 15-03-2005 à 16:24:31
ya plus de cotes et scanf(%s est enleve au benefice de fgets.
regarde le dernier code posté à 16h04 c'est corrigé...
MAis toujours mon probleme de segfault
Marsh Posté le 15-03-2005 à 16:26:03
et le fait que ca tourne indefiniment sur le Ppc j'espere que ton systeme n'est pas corrompu à cause de moi (ppc c'est stable ...)
Marsh Posté le 15-03-2005 à 16:51:16
Code :
|
chez moi ça fonctionne parfaitement...ouf
pour saisir des nombre entiers ou flottants faut t'il utiliser scanf ? si non quelle fonction ?
Marsh Posté le 15-03-2005 à 16:55:50
Merci à tous pour vos réponses, je peut comprendre que j'agace les puristes. Mais je ne le fait pas expres. D'ailleur je me suis posé la question si je postait ce code ou pas. Mais parfois il faut un peu de courage temp pis pour le phrases assasines et le ridicule.
Marsh Posté le 15-03-2005 à 18:02:26
NiQoZ1 a écrit : chez moi ça fonctionne parfaitement...ouf |
Voici une version plus industrielle de ton code. On peut faire mieux avec un tableau de structures plutôt que 3 tableaux de même taille...
|
Marsh Posté le 15-03-2005 à 18:04:10
NiQoZ1 a écrit : Merci à tous pour vos réponses, je peut comprendre que j'agace les puristes. Mais je ne le fait pas expres. D'ailleur je me suis posé la question si je postait ce code ou pas. Mais parfois il faut un peu de courage temp pis pour le phrases assasines et le ridicule. |
Le problème n'est pas ton code intial qui est ce qu'il est, mais plutôt quand tu lis mal les réponses, et ça, ça énerve...
Marsh Posté le 15-03-2005 à 18:30:49
merci beaucoup pour ton exemple je vais de ce pas l'etudier en detail .
Marsh Posté le 15-03-2005 à 19:19:39
Emmanuel > Franchement arrête de faire les corrigés. Tu vois bien que certaines personnes ne font pas d'effort. Je lui fait une remarque sur la borne sup d'un tableau ... il commente l'instruction au petit bonheur la chance, ET à la ligne en dessous, c'est exactement le même problème : dépassement de capacité ...
C'est vraiment pas bien de faire des corrigés, surtout quand la personne ne comprend rien et n'a pas envie de.
Marsh Posté le 16-03-2005 à 08:53:21
il a manger quoi le bisounours pour être aussi con. Car si la ligne d'en dessou ne lui plai pas c'est peu être que l'apprenti codeur n'a pas compri la 'remarque'...
Alors heureusement qu'il y a des gars comme emmanuel sinon les débutants ne feraient que de ce heurter à des remarques de ce genre et ne progresserai pas d'un yota.
A bon entendeur (mais à mon avis il est sourd) salut...
Marsh Posté le 15-03-2005 à 13:45:42
Mon programme (un petit exo que j'avait fait en perl que je refait en C pour m'apprendre) fonctionne mais il ya une erreur de segmentation des que je le quitte.
(je n'ose pas poster le code car je débute ...sic)
Que veut dire ce genre de backtrace ??
---------------
NiQoZ