Titre: [C] Un même calcul avec des résultats différents à chaque fois ?! Posté par: The-Snake le 11 Janvier 2009 à 23:49:26 Voilà, j'essaye de débugger un programme et je ne comprend pas du tout ce qui ne va pas. Voyez plutôt :
Citation int main() { int last_x; int cur; int res; printf("Entrez l'intervalle sous la forme a b ;\n"); scanf("%d %d", &first_x, &last_x); cur = first_x; printf("Intervalle => [%d:%d]\n", cur, last_x); while (cur <= last_x) { res = sin(cur) - 1 + cur; printf("Value 1 : %d, Value 2 : %d, Value 3 : %d\n", res, sin(cur) - 1 + cur, sin(cur) - 1 + cur); if (sin(cur) - 1 + cur == 0) printf("L'équation f(x) = 0 se vérifie pour x = %d\n", cur); cur++; } return (0); } Voilà ce code que j'ai produit pour essayer d'expliquer un bug. Malheureusement, je n'y comprend rien. Pourquoi à chaque valeur de cur, Value 1, Value 2 et Value 3, qui sont tous censé valloir => sin(cur) - 1 + cur et donc avoir des valeurs identiques... ont trois valeurs différentes ! Par exemple, pour l'intervalle [-5:5] : Citation Value 1 : -5, Value 2 : 151, Value 3 : 148 Value 1 : -4, Value 2 : 367, Value 3 : 364 Value 1 : -4, Value 2 : 74, Value 3 : 0 Value 1 : -3, Value 2 : 223, Value 3 : 220 Value 1 : -2, Value 2 : 295, Value 3 : 292 Value 1 : -1, Value 2 : 295, Value 3 : 292 Value 1 : 0, Value 2 : 295, Value 3 : 292 Value 1 : 1, Value 2 : 223, Value 3 : 220 Value 1 : 2, Value 2 : 74, Value 3 : 1 Value 1 : 2, Value 2 : 367, Value 3 : 364 Value 1 : 3, Value 2 : 151, Value 3 : 148 Titre: Re : [C] Un même calcul avec des résultats différents à chaque fois ?! Posté par: blopblop le 12 Janvier 2009 à 01:22:46 Surement parce que la fonction sin te retourne un double et que tu la mets dans un int, tu n'aurais pas un warning ? Conséquence, la valeurs ne rentre pas dans la zone mémoire délimité et déborde sur la zone mémoire à coté faussant donc les valeurs des variables suivantes.
Il faut faire très attention en C sur la gestion de la mémoire et les types de variable car à l'exécution tu peux avoir des surprises ... Titre: Re : [C] Un même calcul avec des résultats différents à chaque fois ?! Posté par: mogg41 le 12 Janvier 2009 à 13:24:38 Je confirme la fonction sin retourne bien un double et j'ajoute qu'elle prend un en paramètre aussi!
Titre: Re : [C] Un même calcul avec des résultats différents à chaque fois ?! Posté par: The-Snake le 12 Janvier 2009 à 15:44:14 Aaah j'ai rien dit oui >< !
J'ai pas l'habitude de compiler sans les flags... Titre: Re : Re : [C] Un même calcul avec des résultats différents à chaque fois ?! Posté par: _o_ le 12 Janvier 2009 à 16:23:06 J'ai pas l'habitude de compiler sans les flags... A copier 100 fois (et à la main, avec un vrai stylo et un vrai papier) : Je ne compilerai plus avec gcc sans le flag -Wall et je ne lancerai pas le binaire tant qu'il y a des avertissements à la compilation. Et c'est valable aussi pour un autre compilateur. Titre: Re : [C] Un même calcul avec des résultats différents à chaque fois ?! Posté par: The-Snake le 13 Janvier 2009 à 17:19:27 Bah justement je suis sur un tout autre programme et je le débug grâces aux bienfaits du Wall (et compagnie).
Et là, je me suis retrouvé dans une situation ambigüe. Que faire quand les warnings et errors ne veulent plus rien dire ? Quand j'ai un warning qui ne correspond à rien. Par exemple, qui prétend qu'il y a une erreur de syntaxe alors qu'il n'y en a pas. En fait, une fois que mon fichier header est retiré, le compilateur ne voit plus ces fausses erreurs de syntaxe... seulement j'ai besoin de ce header. J'en ai d'abord déduit que l'erreur de syntaxe se trouvait dans mon header. Mais ce n'est pas le cas. Il n'y a aucune erreur de syntaxe nulle part. Je tombe par exemple sur des erreurs comme ça : Citation gere_list.c:66: warning: ISO C forbids nested functions Et des erreurs du genre, même si dans le header et dans le fichier en question la suite de caractère '->' n'apparait jamais.gere_list.c:66: error: expected '=', ',', ';', 'asm' or '__attribute__' before '->' token gere_list.c:66: error: expected expression before '->' token Naturellement, si je déplace la fonction qui débute en ligne 66 ailleurs, il trouve un autre bouc émissaire, une autre fonction même dans un autre fichier. La solution que j'ai trouvé, c'est de déplacer certains headers term.h, termios.h, sys/ioctl.h et de les mettre uniquement dans le fichier qui en avait besoin, plutôt que dans le header général. Une fois que ceci est fait, j'ai une compilation sans erreurs ni warnings. Et maintenant que j'y pense, ce n'est pas la première fois que j'ai ce genre de saletés qui apparaissent quand j'inclus ces fichiers. Vous avez une idée de à quoi sont dû ces warnings ? Qu'est-ce qui peut biaiser le compilateur à ce point ? Titre: Re : Re : [C] Un même calcul avec des résultats différents à chaque fois ?! Posté par: _o_ le 13 Janvier 2009 à 18:52:35 Vous avez une idée de à quoi sont dû ces warnings ? Une requête google sur les messages en question peut fournir des explications. Citation Qu'est-ce qui peut biaiser le compilateur à ce point ? Boule de cristal, tout ça... Ne pas oublier également qu'un compilo comporte des bugs, comme tout logiciel, ça peut être une explication. |