Erreur de segmentation (core dumped) [ C ] - C - Programmation
Marsh Posté le 09-11-2008 à 14:25:02
Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par O'gure
Marsh Posté le 09-11-2008 à 14:47:38
Ton code est fouilli. Decoupes ca en fonction a but restreint (lire le fichier, creer les tableaux, les remplir) tu y verras deja plus clair.
Marsh Posté le 09-11-2008 à 15:20:27
n'utilise pas feof (ou alors lis sa documentation).
while(fgets(...) != NULL) est la bonne méthode.
Marsh Posté le 10-11-2008 à 09:38:09
Ici, dans ce programme, c'est un peu fouillis, surtout parce que l'indentation est mauvaise, mais sinon la longueur n'est pas exagérée, il y a des commentaires, et l'absence de sous-fonctions n'est pas la cause du problème. Ici, dans ce programme, feof() n'est pas non plus la cause du problème.
Le cause est la mauvaise utilisation de la variable "i".
Marsh Posté le 10-11-2008 à 10:04:24
Si tu cherchais au moins où ça plante... la valeur de i, etc. C'est le B.A.BA du débogage.
Marsh Posté le 10-11-2008 à 13:33:59
Bonjour,
J'ai essayé de débugger avec gdb et je n'ai rien vu. La valeur de i ne pose pas de problèmes. Pour tester, j'ai rajouté 2 instructions au sortir de la fonction. Je rappelle qu'elle renvoit un tableau de pointeurs.
tableau_etats = rechercher_etats(p_fichierM); // où p_fichierM est un pointeur sur un fichier contenant la ligne "e1 e2 e3 e4 e5#"
printf("Avant : tableau_etats[0] = %s\n",tableau_etats[0]);
printf("Tout est OK\n" );
printf("Apres : tableau_etats[0] = %s\n",tableau_etats[0]);
Il affiche :
"Avant : tableau_etats[0] = e1
Tout est Ok
Erreur de segmentation (core dumped)" Au lieu d'afficher "Après : tableau_etats[0] = e1"
Autrement dit, j'ai l'impression qu'entre deux instructions, la valeur du pointeur est supprimée ?!!! Deux instructions identiques séparées par l'affichage de "Tout est Ok" et l'une donne la bonne valeur et après, PLUS RIEN. Une erreur de segmentation.
J'essaie de débogger avec valgrind s'il en y a qui connaissent et je vous tiens au courant.
A tout à l'heure
AR
Marsh Posté le 10-11-2008 à 14:11:51
1. typedef char* t_etats;
45. t_etats tab_etat[maxetats+1]; tab_etat[maxetats]=NULL;
en fait l'erreur c'est ligne 45. Je suis surpris que ca compile en fait. Faut faire un malloc à la place d'une déclaration.
Marsh Posté le 10-11-2008 à 14:49:24
Ok, merci Philippe. Je fais ça et je te met au parfum
Mais, quelle est réellement la différence entre un malloc d'une taille fixe et la déclaration d'un tableau de la même taille fixe ? Y a-t-il une différence en mémoire ?
AR
Marsh Posté le 10-11-2008 à 14:58:25
Putain, ça marche NIIIIIIIIIIIIKKKKKKKKKKELL. Ca fait des jours que je cherche... Avec différents déboggeurs.
Tu m'expliques Philipe stp ?
Je crois qu'une fois que j'aurais compris ça, ça restera gravé à TOUT JAMAIS. Bon, alors pourquoi faire un malloc plutôt que de déclarer un tableau ?
Je suis prêt à apprendre ma leçon...
AR
Marsh Posté le 10-11-2008 à 15:10:41
Oui, il y a une différence en mémoire, c'est tout à fait ça:
malloc -> tas
déclaration -> pile ou "zone statique"
pour une déclaration, il faut connaitre la taille avant l'execution. Si tu veux faire une zone mémoire de taille variable, il faut faire des mallocs.
Marsh Posté le 11-11-2008 à 21:45:49
ReplyMarsh Posté le 11-11-2008 à 22:06:30
Je m'en souviendrais ...
Marsh Posté le 11-11-2008 à 22:08:32
morph a écrit : int foo(int n) |
Possible, mais je ne sais pas ce qui leur est passé par la tête pour nous pondre les VLA. Probablement une grosse pierre.
Mise en situation :
- n est négatif > plantage
- n est abusivement grand > plantage
- problème d'allocation > impossible de le savoir
Bref, les VLA, c'est pas une bonne idée je trouve.
Marsh Posté le 11-11-2008 à 23:02:00
Sachant que 'abusivement grand' ca commence à 1024 double :E
Marsh Posté le 11-11-2008 à 23:15:17
Juste pour ma culture VLA, c'est l'acronyme de quoi ? (le 'L' et 'A', j'imagine que c'est Local Allocation)
Marsh Posté le 09-11-2008 à 13:16:33
Bonjour à tous,
Je suis débutant en C et je me mêle les pinceaux avec les pointeurs en ce moment. Je vous expose mon problème.
Je souhaite :
1 - Aller chercher dans un fichier une ligne qui contient par exemple : "etat1 etat2 etat3 e4 e5#" (espaces compris)
2 - Maintenant, je voudrais créer un tableau de 5 pointeurs. Chaque pointeur, pointera sur chacune des chaines de caractères. Autrement dit, si on appelle, le tableau : tab_pointeurs, on aura :
tab_pointeurs[0] qui pointe sur "etat1"
tab_pointeurs[1] qui pointe sur "etat2"
......
tab_pointeurs[4] qui pointe sur "e5"
SEULEMENT, on ne sait pas à l'avance combien d'états on aura dans le fichier, et donc de combien de pointeurs on aura besoin. Et on ne sait pas non plus quelle taille feront chaque chaine de caractères. D'où les allocations mémoires.
Je ne sais pas si le problème est assez clair .
Merci d'avance
Message édité par AigleRoyal le 10-11-2008 à 13:07:12