segment fault pour du C (tabl d'élément) - C - Programmation
Marsh Posté le 26-09-2005 à 12:07:41
Variable globale, ça commence mal...
Retour de calloc() non testé, c'est mauvais.
Tu ne maîtrises visiblement pas scanf(), il vaut mieux s'en tenir à des fonctions type fgets() pour ce genre de chose... scanf() n'est pas trivial, de la manière dont tu l'utilises c'est très facile de faire planter ton programme.
Ensuite plutôt que de mettre des "10" partout, déclare un #define MAXLENGTH par exemple qui va te servir et pour la limite de ton tableau, et pour la limite de tes for().
Le jour où tu voudras mettre 100, tu n'auras qu'une seule ligne à changer (enfin ce serait mieux avec du dynamique, genre un malloc() de 10 puis des realloc() si besoin).
Je vois que tu testes des tab[...].nom == NULL, mais ton tableau n'est jamais initialisé. Tes structures contiennent potentiellement n'importe quoi.
Pas le courage de regarder le reste pour le moment, ce serait cool que tu fasses le ménage dans ton code (et dans ton indentation), et que tu tentes d'isoler le problème.
Avec un debugger, par exemple.
Marsh Posté le 26-09-2005 à 12:14:01
ReplyMarsh Posté le 26-09-2005 à 12:15:16
chrisbk a écrit : tu fais un switch sur un char * et tes cases portent sur un char, y'a merde la |
Ah oui bien vu, j'ai le sentiment que le scanf() devrait contenir %c pour com. Enfin fgetc() serait de toute manière plus sage.
Marsh Posté le 27-09-2005 à 10:38:42
je switch sur un char. com est défini en char, c'est la commande qui est tapée par l'user. -pour le reste, je corrige, mici ^____^
Marsh Posté le 27-09-2005 à 10:46:39
kinokoShan a écrit : je switch sur un char. com est défini en char, c'est la commande qui est tapée par l'user. -pour le reste, je corrige, mici ^____^ |
oui, mais bon ... vu la manière dont tu l'utilises dans ton scanf, y'a un petit souci quelque part, hein
et d'ailleurs, pourquoi tu passes une fois un char ** à ton scanf et une autre fois un char * pour le même formatage (%s) ? Vérifie ce que tu attends (et scanf, c'est pas terrible, pour écrire du code fiable )
Marsh Posté le 27-09-2005 à 11:13:17
Pour scanf, je veux bien te croire, mais j'ai testé avec scanf("%c",com) et il ne prend pas la commande, il finit tout de suite... -atta j'essaie avec fgets ! X+
Marsh Posté le 27-09-2005 à 11:24:57
kinokoShan a écrit : Pour scanf, je veux bien te croire, mais j'ai testé avec scanf("%c",com) et il ne prend pas la commande, il finit tout de suite... -atta j'essaie avec fgets ! X+ |
scanf("%c", &com)
Je crois que tu devrais faire une pause dans ton programme, et que tu étudies les pointeurs le temps de quelques exercices simples, pour que tu puisses y voir plus clair. Parce que j'ai le sentiment que tu t'emmêles les pinceaux, ça va te porter préjudice par la suite.
Evite le jeu du "je teste jusqu'à ce que ça fonctionne", c'est le meilleur moyen de créer du bancal et de l'instable.
Et si tu veux utiliser autre chose que scanf() (ce que je te recommande), pour la saisie d'un seul caractère, utilise fgetc() plutôt que fgets().
Marsh Posté le 27-09-2005 à 12:42:01
c'est po ma faute
*révise révise*
Bon maintenant c'est un segment fault sur le case ('s') au niveau du
Code :
|
...
Le code en intégralité ...?
Code :
|
Marsh Posté le 27-09-2005 à 12:42:21
c'est po ma faute
*révise révise*
Bon maintenant c'est un segment fault sur le case ('s') au niveau du
Code :
|
...
Le code en intégralité ...?
Code :
|
Marsh Posté le 27-09-2005 à 13:09:09
Je me permets d'ajouter des commentaires à ton code, ce sera plus simple je pense :
Code :
|
EDIT : foutu forum et son interprétation des backslash
Marsh Posté le 27-09-2005 à 14:06:54
Mici c'est très complet ! Je corrige et je ferais un rapport détaillé XD
-vu la tonne d'erreur, chuis en train de me dire que je vire Microsoftienne oÔ-
^____^
Marsh Posté le 27-09-2005 à 15:08:16
kinokoShan a écrit : Mici c'est très complet ! Je corrige et je ferais un rapport détaillé XD |
J'ai pas examiné ce code en détail (j'espère que Taz ne tombera jamais dessus un jour parce que tu vas comprendre ta douleur)... mais il me semble que, pour rajouter un nom, tu utilises l'algo suivant:
1) faire saisir le nom dans la variable "ftmp"
2) stocker l'adresse de cette variable dans "tab[i].nom"
Si vraiment c'est ça, alors en final tu auras un tableau de "n" éléments contenant tous la même adresse, à savoir l'adresse de "ftmp". Donc, si tu affiches ton annuaire tu auras à l'écran "n" fois le dernier nom saisi...
De plus, ce genre d'instruction "if (*tab[i].nom == *ftmp)" c'est absolument pas bon. Tu ne fais que comparer le premier octet de "tab[i].nom" avec le premier octet de "ftmp". Et n'enlève surtout pas l'étoile, car cela reviendrait à comparer des adresses !!!
Suis les conseils de Elmoricq. Fais une pause, étudie en détail comment fonctionne un pointeur et une chaîne de caractères puis recommence tranquillement. T'as un bon cours de C ici http://fr.lang.free.fr/cours/Langa [...] e_v2.0.pdf qui explique bien les pointeurs au chapitre X (page 58)
En général, pour ce genre d'algo (insertion/suppression), on utilise de préférence une liste chaînée. Chaque élément contient ses infos plus l'adresse de l'élément suivant. Cela permet d'insérer ou de supprimer très facilement un des éléments intermédiaires sans avoir besoin de tout décaler ce qu'il y a après...
kinokoShan a écrit : -vu la tonne d'erreur, chuis en train de me dire que je vire Microsoftienne oÔ- |
C'est pas faux...
Marsh Posté le 27-09-2005 à 15:11:16
Sve@r a écrit : En général, pour ce genre d'algo (insertion/suppression), on utilise de préférence une liste chaînée. Chaque élément contient ses infos plus l'adresse de l'élément suivant. Cela permet d'insérer ou de supprimer très facilement un des éléments intermédiaires sans avoir besoin de tout décaler ce qu'il y a après... |
+1
Je ne l'ai pas mentionné parce que je me suis dit que c'était déjà assez difficile comme ça avec un simple tableau.
Pas de secret, faut bosser les pointeurs, là ça part trop dans tous les sens.
Marsh Posté le 30-09-2005 à 11:46:18
Okish je m'y mets *retrousse ses manches*
Mici les gars ^______^
Marsh Posté le 26-09-2005 à 12:00:35
Boujour tout le monde, un bail, n'est-ce pas ? hm passons.
En fait je dois écrire un annuaire en c, qui doit pouvoir gérer l'insertion de nouveaux...élèves, mettons, la suppression, la recherche...
Oui sauf que je me retrouve avec une insertion gérée sans défaut, mais qui n'a pas lieu concretement.
Avec à la fin de l'execution un segment fault...
Si vous avez un petit tuyau ça serait nickel pour l'UC, sinon j'ai pas fini de la faire chauffer XD
Mici ^___^'
Message édité par kinokoShan le 26-09-2005 à 12:02:00