IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Abberation avec l'expression watcher


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut Abberation avec l'expression watcher
    Bonjour à tous.
    Je n'ai pas l'habitude de demander de l'aide sur des problèmes de debuggage, mais là je tombe sur quelquechose de complétement dingue !

    Voici ma ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int test = ( (resultat * b ) == a )
    a , b et resultat sont de type double

    Je travaille sur debian avec eclipse et gcc en utilisant le standard c99

    Dans le expression watcher je vois ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ( (resultat * b ) == a )       int           1
    test                           int           0
    Comment est ce possible que la partie droite de mon instruction obtienne bien le bon type et la bonne valeur, alors que la partie gauche (une simple affectation) obtienne une valeur différente et erronnée????

    Mon code est très simple, un seul thread...

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je ne connais pas ton IDE mais si l'affectation à test n'a pas encore eu lieu cela me semble tout à fait normal.

    Où se trouve le pointeur d'instruction au moment où tu es témoin de ce comportement ?

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Cela peut arriver quand on debugge du code optimisé, la variable test étant peu ou pas utilisée n'existe finalement pas du tout.
    La déclarer volatile peut changer les choses.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Cela peut arriver quand on debugge du code optimisé, la variable test étant peu ou pas utilisée n'existe finalement pas du tout.
    La déclarer volatile peut changer les choses.
    Il faut surtout compiler en mode debug, avec -g, -O0 ou encore -Og.

    Ce n'est pas une question de peu ou pas utilisé. C'est simplement le principe de l'optimisation : utiliser au mieux les ressources. Cela passe souvent pas un inlining des variables, qui sont "placées" dans des registres.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Merci pour vos réponses.
    En fait j'ai limité le code ici à son maximum.

    Dans les fait, j'avais donc une fonction qui retournait cette abération.

    En scindent ma ligne, j'ai pu résoudre le problème :
    avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int TestDivision(double a, double b, double resultat)
    {
    	return ( a == 0 || ( (resultat * b ) == a ) ) ? RESULTAT_VALIDE : RESULTAT_INVALIDE;
    }
    maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int TestDivision(double a, double b, double resultat)
    {
    	double test = (resultat * b );
    	return ( a == 0 || ( test == a ) ) ? RESULTAT_VALIDE : RESULTAT_INVALIDE;
    }
    Optimisation ou pas, je suis surpris par le phénomène...

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Sans jouer les oiseaux de mauvaises augures ton code ne vaut pas tripette: on ne doit jamais comparer des flottants avec une égalité ==

Discussions similaires

  1. envois d'un mail avec outlook express en vb
    Par trefles dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 07/01/2006, 18h27
  2. Envoi E-mail avec Outlook Express
    Par chim33 dans le forum Access
    Réponses: 6
    Dernier message: 24/12/2005, 17h14
  3. DEADLOCK + RAFRAISHISSEMENT avec Inerbase Express + Int.6
    Par AODRENN dans le forum Bases de données
    Réponses: 1
    Dernier message: 22/09/2005, 16h53
  4. Probleme avec l'expression d'un QRExpr
    Par smail21 dans le forum Bases de données
    Réponses: 3
    Dernier message: 31/07/2005, 09h19
  5. Requête avec l'expression Like
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 02/09/2003, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo