Bonjour à tous,
C'est la première fois que je laisse un message sur ce type de forum et je m'excuse d'avance des manques de précisions éventuels. Je vais essayer de donner le plus de détails.
Je travaille actuellement sur un code C ANSI auto-généré à partir d'un modèle Simulink et je veux le faire tourner sous Linux. Je l'ai compilé avec gcc et j'ai créée un exécutable de test pour alimenter l'autocode.
Tout paraissait fonctionner, mais les calculs étaient faux (la plupart des résultats étant "nan" Not a Number).
Au debug (GDB, printf...), je me suis rendu compte que certains calculs ne se faisaient pas bien.
Le bug qui revient plusieurs fois est le suivant :
(NoLigne) variable = valeurINIT;
(NoLigne+1) variable = expressionDeCalcul(parametre1,
parametre2,
parametre3...);
- expressionDeCalcul est une expression littérale qui fait en général
une simple combinaison de multiplication, addition, soustraction,
division des paramètres...
- le type des paramètres et de la variable calculée est "double"
(pas de problème de type en gros)
- les paramètres ne sont pas à "nan" et il n'y a pas de division par 0,
de racine carré de nb négatif...
- Dans gdb, après l'exécution de "NoLigne", variable a la bonne valeur.
Après l'exécution de "Noligne+1" (qui succède directement l'exécution
de NoLigne), variable est à "nan".
Pourtant l'impression de l'expression littérale dans GDB
( p expressionDeCalcul ) me donne une bonne valeur.
Exemple :
variable = 0.0;
variable = (fytr+fytl)*(rx+(XCT-0.25)*ba)-(fxtr+fxtl)*(ry-YCT);
(gdb) p variable
$46 = -nan(0x8000000000000)
(gdb) p (fytr+fytl)*(rx+(XCT-0.25)*ba)-(fxtr+fxtl)*(ry-YCT)
$47 = 0.93050826743603743
Ce sont des calculs vraiment simples, et des calculs similaires en tous points ne buge pas. J'en conclu que ce n'est pas un problème de codage (enfin pas directement)....
Et c'est là que je suis sec et que je fais appel à vous.
Si vous avez des pistes de recherches (ex : causes de jardinage mémoire sous Linux avec code C compilé) ou si vous avez déjà rencontré ce type de bug, çà m'interesserais beaucoup.
J'en serai très reconnaissant et la gratification spirituelle sera énorme.
Merci d'avance
Mickaël
Partager