Polynômes, dépassement de mémoire - C - Programmation
Marsh Posté le 04-06-2008 à 21:14:38
T'avais pas plus long à nous faire lire ?
Et si tu sabrais tout ce qui ne change rien au problème et que tu nous montrais le code complet le plus simple qui provoque le problème ?
Marsh Posté le 04-06-2008 à 22:15:28
Ton code est imbitable, buffer overflow, tableau inutile, indentation bordélique, pas étonnant que tu passes des heures à débugger ce foutoir.
Pour info, ton erreur se situe certainement à la ligne 128 :
Code :
|
En déclarant ton tableau de N cases et affectant dans la N+1 ème case, tu écrase en fait la variable locale précendante de ton programme (du fait que sur la pile les variables sont empilés les unes sur les autres) qui est ... ton pointeur p4.
Par un concours de cirsconstance que j'ignore, mais à ce niveau on s'en tape, p4 se retrouve initialisé à 0, valeur transmise à Sign, puis transmise à Eval, puis ... SEGFAULT.
Marsh Posté le 04-06-2008 à 22:44:04
tpierron a écrit : Ton code est imbitable, buffer overflow, tableau inutile, indentation bordélique, pas étonnant que tu passes des heures à débugger ce foutoir. |
La structure du code nous a été fournie par nos professeurs . (J'ai évidement ajouté pas mal de bordel). L'indentation, c'est le copier coller qui a foiré...
tpierron a écrit :
|
Je vais méditer ça, mais je n'ai pas très bien compris à première vue comment y remédier... Je repasse dans une heure ou deux
P.S : J'ai eu en consigne :
Citation : uint Roots(struct Polynome *p, double x1, double x2, double *out) |
P.S 2 : J'ai un problème en ammont qui n'arrange pas les choses :
Code :
|
Je viens juste de me rappeler à peu prêt comment on compare des float....Et je n'avais pas fait comme ça...
Marsh Posté le 04-06-2008 à 23:33:26
J'ai changé quelques petits trucs tel que :
Le calcul des valeurs en 0 :
Code :
|
L'appel de mes fonctions dans le main
Code :
|
Un peu de débugage :
Code :
|
Et là, j'ai les yeux embrouillés....
Marsh Posté le 05-06-2008 à 00:58:51
Je lui ai pété un EPSILON dans la gueule
Marsh Posté le 05-06-2008 à 01:44:18
Youhou, ça marche... (Enfin pour une valeur précise d'EPSILON avec un polynome particulier...)
Marsh Posté le 05-06-2008 à 09:03:51
ReplyMarsh Posté le 05-06-2008 à 15:13:02
Ce code est une horreur , ouvre un bouquin sur les bases du C (chapître tableau) ou (on peut réver) lis les réponses postées.
Code :
|
À la limite change au moins la déclaration de "out" en :
Code :
|
Marsh Posté le 05-06-2008 à 15:43:28
Taz a écrit : montre le code de ton Allocate qu'on rigole ? |
Cette fonction vient de ce professeur http://perso.univ-rennes1.fr/jean-claude.nunes/
Code :
|
C'est si drôle que ça ?
tpierron a écrit : Ce code est une horreur , ouvre un bouquin sur les bases du C (chapître tableau) ou (on peut réver) lis les réponses postées.
|
Ce N+1 ne changerai rien. En effet, la fonction Roots était erroné et renvoyait plusieurs centaines de racines dans le tableau (avec N=10)...Il y avait juste un problème de calibration de la fonction Roots pour déterminer à partir de quand on détectait une racine assez proche de 0 pour être considérer égale à 0 (et par conséquent être enregistrer comme racine dans out[N]).
Enfin, je ne voie pas trop l'intérêt de remarques comme ça "(on peut réver)"... (Tu as peut-être quelques connaissance en C mais cela ne te dispense pas d'un minimum de courtoisie)
Marsh Posté le 05-06-2008 à 16:04:22
Petit test. Quoi que fasse la fonction Roots, ce code est foireux :
Code :
|
Tu n'as pas l'air de t'en rendre compte. On t'as donné la réponse, et t'as reposté un nouveau code avec la même annerie. Conclusion: tu ne lis pas les réponses ou tu ne les comprends pas, dans ce cas pose d'autres questions.
Marsh Posté le 06-06-2008 à 22:18:19
tpierron a écrit : Petit test. Quoi que fasse la fonction Roots, ce code est foireux :
|
Code :
|
Autant pour moi. Le manque de sommeil, la mauvaise compréhension du prototype de Roots() et mes "connaissances" en C ne m'ont pas beaucoup aidé sur ce coup (Je ne poste pas pour le plaisir de poster, par conséquent, je regarde quand même les réponses)
Code :
|
P.S : L'indentation de ce forum est #@'é')'é
Marsh Posté le 07-06-2008 à 15:03:29
Code :
|
Oui on peut rigoler effectivement :
Une erreur : une précaution indispensable est de vérifier le retour du malloc, on ne sait jamais, le retour peut-être NULL auquel cas ton programme plante.
Une maladresse, mais là certains en discutent, en C, on ne caste pas en général le retour de malloc, il peut masquer l'oubli d'inclusion du .h déclarant la fonction malloc.
ton code corrigé pourrait donner ceci :
Code :
|
Marsh Posté le 04-06-2008 à 21:09:07
Bonjour,
Je réalise un programme en C qui réalise des opérations sur des polynômes définis tels que :
La plupart des fonctions fonctionnent (enregistrement d'un polynome, chargement à partir d'un fichier binaire, lecture d'un fichier binaire, calcul en x=?, dérivé, etc...).
J'ai cependant un problème lorsque je calcul le signe avec ma fonction double Eval(struct Polynome *p, double x) qui me calcul la valeur du polynôme en un point.
J'utilise la fonction Roots pour calculer approximativement quand le polynôme s'annule.
Cette fonction fait appel à Eval et il n'y a pas de problèmes. Cependant lorsque j'appelle de nouveau Eval dans une autre fonction, ça plante. Eval veut lire un polynôme à une adresse nulle... Pourquoi ?La fonction Sign prend "mal" mon polynome en argument (Breakpoint 1, Sign (p=0x0, x1=-5, x2=5) at aau.c:242), Pourquoi ?
Le programme est compilé avec ces options : gcc -g aau.c -o aau -lm -Wall
La sortie du gdb :
Le programme :
Edit : c'ets vrai c'était un peu long...
Message édité par 2xyo le 04-06-2008 à 21:25:38
---------------
2 * yo = yoyo