logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] Un même calcul avec des résultats différents à chaque fois ?!  (Lu 3961 fois)
The-Snake

Profil challenge

Classement : 9207/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« 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
« Dernière édition: 11 Janvier 2009 à 23:58:33 par The-Snake » Journalisée
blopblop
Profil challenge

Classement : 2221/54283

Néophyte
*
Hors ligne Hors ligne
Messages: 14


Voir le profil
« #1 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 ...
Journalisée
mogg41

Profil challenge

Classement : 449/54283

Membre Senior
****
Hors ligne Hors ligne
Messages: 267

Mogg41 pour vous aider!


Voir le profil
« #2 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!
« Dernière édition: 12 Janvier 2009 à 16:35:55 par mogg41 » Journalisée

"Il ne savait pas que c'était impossible alors il l'a fait." Mark Twain
The-Snake

Profil challenge

Classement : 9207/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« #3 le: 12 Janvier 2009 à 15:44:14 »

Aaah j'ai rien dit oui >< !
J'ai pas l'habitude de compiler sans les flags...
Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54283

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #4 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.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
The-Snake

Profil challenge

Classement : 9207/54283

Membre Junior
**
Hors ligne Hors ligne
Messages: 78


Voir le profil
« #5 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
gere_list.c:66: error: expected '=', ',', ';', 'asm' or '__attribute__' before '->' token
gere_list.c:66: error: expected expression before '->' token
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.
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 ?
« Dernière édition: 13 Janvier 2009 à 17:21:29 par The-Snake » Journalisée
_o_
Relecteur

Profil challenge

Classement : 42/54283

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #6 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.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
Pages: [1]
  Imprimer  
 
Aller à: