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 :

Eviter warning C4244


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut Eviter warning C4244
    Bonjour

    Je me heurte au problème suivant:
    Suite à un portage, je me retrouve avec le problème illustré dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void main()
    {
    	float toto = 0;
    	float tata = 0;
    	tata = 2.5*toto + 3*5;
     
    }
    Le compilateur (visual studio 2010 express) me retourne "warning C4244: '=' : conversion from 'double' to 'float', possible loss of data", ce que je comprend, il interprète 2.5 comme un double.

    Je corrige facilement ce problème en castant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void main()
    {
    	float toto = 0;
    	float tata = 0;
    	tata = (float)2.5*toto + 3*5;
     
    }
    Cependant je ne peux pas tout caster à la main (plus de 1000 warnings), et je ne veux pas laisser en l'état.

    Je dois utiliser ce compilateur et je dois rester en float (je ne veux pas non plus cacher le problème avec warning=off).

    Avez vous connaissance d'un moyen, soit pour caster automatiquement, soit d'une option de compilation permettant d'interpréter tous les chiffres entrés en dur comme des float?

    Merci d'avance!

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,
    Citation Envoyé par Fiabulu Voir le message
    Avez vous connaissance d'un moyen, soit pour caster automatiquement, soit d'une option de compilation permettant d'interpréter tous les chiffres entrés en dur comme des float?
    Oui, tu dois écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tata = 2.5f*toto + 3*5;
    D'ailleurs je suis surpris que GCC n’émette pas de warning !?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    C'est bien ce que je craignais, il n'existe pas de moyen d'éviter que je modifie manuellement les (environ) 1000 lignes de codes qui posent problème...

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Sous visual Studio, a mettre dans le source cpp qui génère ces erreurs.

    // Disable warning messages 4244.
    #pragma warning( disable : 4244 )

    Par contre, ATTENTION, cela va te masquer toutes les erreurs C4244, même les nouvelles qui ne sont pas liées avec ton problème de double/float.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Oui mais cette solution camoufle le problème. Il y a toujours une conversion qui est faite par la compilo, mais elle n'est plus source de Warning.

    J’espérais qu'il existe une option qui permette de dire au compilo que les valeur "en dur" soit par défaut des float et non des doubles.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Fiabulu Voir le message
    J’espérais qu'il existe une option qui permette de dire au compilo que les valeur "en dur" soit par défaut des float et non des doubles.
    Pas à ma connaissance, désolé
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Hello

    à mon avis, il y a moyen avec une regex de passer ton source dans un script pour transformer les nombres au format x.xx au format x.xxf, ce qui corrigera le problème.
    Find me on github

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Sont fainéant ces développeurs des fois. A raison de quelques secondes par warning pour le fixer t'en a pour quoi ? 1/2 journée à tout casser.

    Aller, au boulot !!!

    Sinon la solution de jblecanard convient aussi.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu as plus de 10 valeurs floats différentes dans ton programme, il y a sûrement un problème.
    Si ces valeurs sont réparties partout dans ton programme, et non globalement centralisées, il y a sûrement un problème.

    Et je serais curieux de savoir quel motif t'empêche de passer en double pour les calculs (quitte à stocker en float, s'il y a de grands volumes de donnée à gérer).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Si tu as plus de 10 valeurs floats différentes dans ton programme, il y a sûrement un problème.
    Si ces valeurs sont réparties partout dans ton programme, et non globalement centralisées, il y a sûrement un problème.

    Et je serais curieux de savoir quel motif t'empêche de passer en double pour les calculs (quitte à stocker en float, s'il y a de grands volumes de donnée à gérer).
    Du vieux code dégueu qu'il faut moderniser/nettoyer/réécrire (rayer la mention inutile) par exemple ?
    Find me on github

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Là, tu as un bon motif pour la phrase "Je vais rester en float".
    Ma question était plutôt sur la phrase "Je dois rester en float", et là, j'ai du mal à voir une bonne raison pour ça. Surtout que la bascule de l'un à l'autre doit être assez rapide...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    J'aurais vraiment tendance à être de l'avis de Loic... :

    L'avertissement te signale que, comme certaines valeurs (2.5 et 3.5) sont considérées comme des double, le fait de les traiter en réalité comme étant des float te fait perdre de la précision, qu'il pourrait le cas échéant, s'avérer intéressant de ne pas perdre

    Il faut aussi se dire que la plupart des IDE récents proposent une fonctionnalité proche de "replace in files" qui permet de remplacer automatiquement toutes les occurences d'un terme par un autre dans l'ensemble des fichiers d'un projet.

    Il est, d'ailleurs, tout à fait possible d'obtenir un résultat similaire sous linux à coup de grep et de sed

    Même sur un projet particulièrement important, cette fonctionnalité ne devrait pas prendre plus de quelques minutes pour effectuer les changements

    Dés lors, pourquoi ne pas faire d'une pierre deux coups en utilisant cette fonctionnalité pour remplacer toutes les occurences de float par... double :

    Cela aura pour résultat d'éviter les avertissements (ce qui est ton but à l'origine ) mais aussi de te permettre d'avoir une précision supérieure, et donc d'éviter les erreurs dues aux arrondis
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Si tu as plus de 10 valeurs floats différentes dans ton programme, il y a sûrement un problème.
    Je pense que ça dépends des valeurs. Si c'est du 42.5, 175.8 ou autre -485.2, oui il y a un problème. Mais il est très fréquent de faire du 0.5*toto, 1.0/toto, toto < 0.0 etc... Là je trouve ça moins choquant.

    Par contre, j’émets des réserves sur tout passer en double. J'avais fait ça sur une lib de calcule géométrique, et résultat les 3/4 des tests ne passaient plus. Soit les valeurs étaient plus précise que les référence (ce qui est normal et pas trop dur à fixer), soit parce que y'avait des == 0.0f qui trainaient dans le code, des epsilon qui ne convenaient plus etc... Et donc vous imaginez bien les dégât sur l'appli elle-même...
    Résultat, 1h pour passer tout en double, 3 jours pour fixer le reste.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    Merci pour cet échange,

    Je suis d'accord avec beaucoup de choses!

    -J'ai pensé au "replace all" float vers double mais le float est un impératif. (nécessité de reproduction de résultats d'un code existant travaillant en équivalent defloat). Vous allez surement me répondre que passez en double n'aurait fait qu'améliorer la précision. Mais moi je pense plutôt comme pyros... on a toujours des surprises en faisant ce genre de remplacement.

    - dans le code initial (fortran) les valeurs entrées comme 3.5 était interprétées par défaut comme du real (même représentation que le float). Les considérer comme des doubles est donc une erreur, l’idéal serait de les définir comme des float 3.5f.

    - pyros, je ne suis pas plus fainéant que les autres . moi je me dis que ça va se finir à rajouter un "f" derrière chaque déclaration!

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 40
    Points : 40
    Points
    40
    Par défaut
    a deux, 2heures pour tout corriger (1100 warnings).

    3. ---> 3.f

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Eviter les mélanges de C et C++ avec un warning dans gcc
    Par erroneus dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 25/05/2010, 01h15
  2. Comment eviter l'erreur : warning Link 4084
    Par simulateurdriss dans le forum Fortran
    Réponses: 1
    Dernier message: 14/04/2010, 09h41
  3. eviter un warning sur un cast
    Par r0d dans le forum C++
    Réponses: 19
    Dernier message: 14/06/2007, 11h53
  4. Eviter les warnings "unused parameter"
    Par Le Furet dans le forum C
    Réponses: 9
    Dernier message: 03/10/2005, 22h29
  5. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21

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