sscanf et lecture de réel - C - Programmation
Marsh Posté le 28-07-2006 à 16:51:23
ReplyMarsh Posté le 28-07-2006 à 16:53:57
Oui autant pour moi j'ai pas mis les type de variable :
s->data[i].volumeCarbu --> float
tmp --> int
L'idée de tmp c'est de récupérer la valeur dans un entier (à la base c'est une valeur entière), mais une fois divisé par 1000 elle devient décimal, d'ou le float.
Marsh Posté le 28-07-2006 à 17:13:36
Si c'est pour faire un sscanf(buffer,"%f",&s->data[i].volumeCarbu)), autant faire un strtod(buffer, NULL); ce sera plus sûr.
(les Xscanf sont trèèèèèèès difficiles à utiliser).
Marsh Posté le 28-07-2006 à 17:19:11
ReplyMarsh Posté le 28-07-2006 à 17:21:09
Je n'avais pas pensé à utliser cette fonction mais malheureusement ca ne passe pas
J'ai mis :
Code :
|
Et j'obtien :
-2147483648,c
Marsh Posté le 28-07-2006 à 17:35:15
Mets errno à 0, avant le strtod(), et regarde sa valeur après.
Marsh Posté le 28-07-2006 à 17:38:27
Et avec un "long double"?
Code :
|
Marsh Posté le 28-07-2006 à 18:07:02
Pour errno elle vaut toujours 0 après le strtod() :s
Et le long double ne résoud pas le problème non plus ...
En tout cas merci de me donner vos idées
Marsh Posté le 28-07-2006 à 18:14:52
Est que quelqu'un aurait une idée de la cause du problème dans le second bout de code ?
J'ai utilisé le debugger pour voir ce qu'il se passait dans ce cas la : tmp prend bien la bonne valeur (qui est donc un entier), mais c'est l'opération suivante (s->data[i].volumeCarbu = tmp/1000.0f qui donne un résultat entier ...
Marsh Posté le 28-07-2006 à 20:22:14
eh bien essaye s->data[i].volumeCarbu = ((float)tmp)/1000.0f
ce serait d'ailleur, sans doute meilleur avec double.
Pour information, les fonctions atoX ne sont plus utilisables depuis 1989 cf http://www.developpez.net/forums/s [...] stcount=19
Marsh Posté le 28-07-2006 à 20:30:34
ThibB a écrit : Bonjour tous le monde ! |
A l'avenir, poste du code compilabel (j'ai passé 20 minutes à réinventer ce qui manquait...)
Ceci a l'air de fonctionner. Mais je recommande double au lieu de float. Meilleure précision, meilleures performances (pas de conversions).
Code :
|
|
avec double :
|
Marsh Posté le 30-07-2006 à 18:31:58
OK merci, je test ca et je vous tiens au courant
Je ferais gaffe la prochaine fois de donner les structures, les type de variables, etc ...
Marsh Posté le 28-07-2006 à 16:40:37
Bonjour tous le monde !
Je rencontre un problème lorsque je cherche à lire des réels depuis un buffer : impossible de faire fonctionner le sscanf ... encore ...
Je lis en fait une ligne de 250 caractères dont les caractère 159 à 165 represente un litrage en mL, dans mon exemple : 1023800 (autre ex : 0048600)
Voila plusieurs bouts de code pour comprendre le problème :
s->data[i].volumeCarbu --> float
tmp --> int
---------------------
Résultat :
Un nombre qui n'a rien a voir du type : 1218173.0
---------------------
Résultat :
Le bon nombre mais sans les décimales (tronqué) : 1023.0
--> Impossible d'avoir le bon résultat : 1023.8
Est ce que quelqu'un aurait une solution ?
Merci d'avance !
Message édité par ThibB le 28-07-2006 à 16:57:54
---------------
Visiter mon site