Problème de conversion sur visual studio

Résolu/Fermé
abyass Messages postés 18 Date d'inscription vendredi 30 juin 2017 Statut Membre Dernière intervention 21 août 2017 - 12 juil. 2017 à 15:55
abyass Messages postés 18 Date d'inscription vendredi 30 juin 2017 Statut Membre Dernière intervention 21 août 2017 - 17 juil. 2017 à 08:53
Bonjour,

J'ai besoin de vos aides SVP.

J'étais entrain de développer sur Code::Blocks et tout marche bien.
Mais je viens de changer l'IDE à Visual Studio et là des warnings inatendus apparaissent.
Voilà un morceau du code:

 
float f;
int i;
f=(int)i;

le warning est :
warning C4244: '=' : conversion de 'int' en 'float', perte possible de données



Je n'arrive pas à le résoudre.

Quelqu'un pourra m'aider SVP.

Merci :)



A voir également:

1 réponse

YCN- Messages postés 116 Date d'inscription mercredi 24 juin 2015 Statut Membre Dernière intervention 13 juillet 2017 12
13 juil. 2017 à 10:02
Salut,
Bah en fait moi je me demande pourquoi Code Blocks ne te disais rien tu n'as peut être tout simplement pas fait attention.
Déjà tu fais plusieurs erreurs.
  • La première et la plus grave c'est que f est un float donc quand tu fais un cast en int, tu fais un trucs bizarre. C'est comme si tu disais, toi tu es une banane transforme toi en cerise. ça ne marche pas...


Tu peux faire ça :
float f;
int i;
i = (int)f;

ou
float f;
int i;
f = (float) i ;
  • Ta deuxième erreur c'est que tu n'as pas initialisé tes variables, donc en fait ce que tu fais a un comportement complètement étrange.


Maintenant si ce que tu veux faire c'est "tronquer", cad, admettons tu as un float égale à 25.355 et que tu veux le convertir en un float égale à 25.0 , il faut que tu fasse ça :

float f = 25.355;
int i = (int) f;
f = (float) i ;


ou encore de manière condensé :
float f = 25.355;
f = (float) ((int) f) ;


YCN-
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 13 juil. 2017 à 18:57
Salut YCN-,

Tu as raison sur le fait que les variables ne sont pas initialisées, cependant je ne suis pas sûr que le code posté par abyass soit complet.

Codeblocks n'est pas un compilateur, c'est un EDI qui peut fonctionner avec de nombreux types de compilateurs.

Il est habituellement utilisé avec gcc, cependant, et c'est probablement avec ce compilateur que abyass compilait son code.

Il est parfaitement légal, en C, de faire :
#include <stdio.h>

int main(void) {
    float f;
    int i = 12;

    f = (int) i;
    f = i;
    printf("i = %d - f = %f\n", i, f);

    return 0;
}

Les lignes 7 ou 8 sont complètement équivalentes, le cast étant inutile puisque i est déjà un int. Dans les deux cas, le contenu entier affecté à f sera implicitement convertit en float.

La compilation de ce code avec gcc et les options
gcc -Wall -Wextra -Wpedantic
ne produit aucun warning.

Selon le standard du C, le type float peut contenir largement ce qui tient dans un int (FLT_MAX vaut au moins 3.40282347E+38F, et INT_MAX +32767).

Par ailleurs, il n'y a pas de "pertes", de décimales dans ce sens (cela arriverait dans l'autre sens, si on affectait un float à un int, avec, en outre, un risque de débordement, non géré dans ton code d'exemple).

Je ne comprends pas l'avertissement de Visual Studio. En cherchant dans la doc de Microsoft, on dirait que le message est lié au compilateur C++.. peut-être abyass a-t-il créé un projet C++. Sous Visual Studio, pour compiler en C et non en C++, il faut que les sources soient nommées .c et non pas .cpp


Dal
0
abyass Messages postés 18 Date d'inscription vendredi 30 juin 2017 Statut Membre Dernière intervention 21 août 2017 > [Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024
17 juil. 2017 à 08:53
Merci pour votre réponse.
En fait, sur Code::Blocks, je compile avec mingw. Et là sur Visual studio, j'ai nommé mes sources .c non .cpp et j'ai même changé l'option compilation sous : Compiler comme code C.

J'ai changé mes float en double et ça marche. J'ai plus ces warnings. Pour moi, ce que j'ai vu qu'il est préférable d'utiliser double au lieu de float .
Donc je ne sais pas si je suis dans le bon sens ou non ?
0