OVH Cloud OVH Cloud

probleme avec les reels en C

6 réponses
Avatar
Vincent Marchal
Bonjour,

J'ai un problème de programation en C sous linux.


Les réels sont systématiquement ramenés à leurs parties entières.

Le même programme fonctionne parfaitement sous un autre système unix
(SGI sous irix 6.5), c'est pourquoi je préfère poser la question sur un
forum linux, plutôt que sur forum C++

Le compilateur est GCC 3.3.5, le système est un Red Hat 9.

Voici le source du prog:


#include <stdlib.h>
#include <stream.h>

int main()
{
float r;
cout << "Entrez un reel a virgule : ";
cin >> r;
cout << " le reel entre est : " << r << endl;


char t[10];
cout << "Entrez un 2eme reel a virgule : ";
cin >> t;

cout << " la chaine est : " << t << endl;
r = atof(t);
cout << " le reel entre est : " << r << endl;

return 1;
}

Et voici le résultat:

1er essai :

Entrez un reel a virgule : 2,3
le reel entre est : 2
Entrez un 2eme reel a virgule : la chaine est : ,3
le reel entre est : 0

Dans cet essai, le programme exécuté ne s'arrête pas pour la saisie de
la variable chaîne. L'affichage de cette variable est donc aléatoire.


2eme essai :

Entrez un reel a virgule : 5
le reel entre est : 5
Entrez un 2eme reel a virgule : 2,35
la chaine est : 2,35
le reel entre est : 2


Si quelqu'un pouvait me denner une idée, une piste...
Merci d'avance.

--
Vincent Marchal

--
Pour contacter l'équipe de modération : moderateurs-fcolm@efrei.fr
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.

6 réponses

Avatar
Julien BLACHE
Vincent Marchal wrote:

Entrez un reel a virgule : 2,3
le reel entre est : 2
Entrez un 2eme reel a virgule : la chaine est : ,3
le reel entre est : 0



locales.

JB.

--
ST: L'intelligence et la connerie ne sont pas incompatibles.
PG: La bêtise et la connerie non plus.
-+- in: Guide du Cabaliste Usenet - Des imbéciles heureux -+-

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
Vincent Bernat
OoO Pendant le temps de midi du mardi 02 août 2005, vers 12:22,
Vincent Marchal disait:

Entrez un reel a virgule : 2,3



Cela nécessite de faire entrer en jeu la locale pour savoir que la
virgule est le séparateur des décimales. Je dirais que ça doit être
automatique, mais que donne le programme quand tu rentres 2.3 ?
--
I AM SO VERY TIRED
I AM SO VERY TIRED
I AM SO VERY TIRED
-+- Bart Simpson on chalkboard in episode AABF20

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
GERBIER Eric
Vincent Marchal wrote:
Bonjour,

J'ai un problème de programation en C sous linux.


Les réels sont systématiquement ramenés à leurs parties entières.

Le même programme fonctionne parfaitement sous un autre système unix
(SGI sous irix 6.5), c'est pourquoi je préfère poser la question sur un
forum linux, plutôt que sur forum C++

Le compilateur est GCC 3.3.5, le système est un Red Hat 9.




Entrez un reel a virgule : 2,3
le reel entre est : 2
Entrez un 2eme reel a virgule : la chaine est : ,3
le reel entre est : 0



c'est un probleme de separateur : il faut saisir 2.3 ( deux point trois)

si tu tiens a la virgule, il faudra bricoler les locales (LC_NUMERIC ? )

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
Bastien Durel
Vincent Marchal wrote:
Bonjour,

J'ai un problème de programation en C sous linux.


Les réels sont systématiquement ramenés à leurs parties entières.

Le même programme fonctionne parfaitement sous un autre système unix
(SGI sous irix 6.5), c'est pourquoi je préfère poser la question sur un
forum linux, plutôt que sur forum C++

Le compilateur est GCC 3.3.5, le système est un Red Hat 9.

Voici le source du prog:


#include <stdlib.h>
#include <stream.h>

int main()
{
float r;
cout << "Entrez un reel a virgule : ";
cin >> r;
cout << " le reel entre est : " << r << endl;


char t[10];
cout << "Entrez un 2eme reel a virgule : ";
cin >> t;

cout << " la chaine est : " << t << endl;
r = atof(t);
cout << " le reel entre est : " << r << endl;

return 1;
}

Et voici le résultat:

1er essai :

Entrez un reel a virgule : 2,3
le reel entre est : 2
Entrez un 2eme reel a virgule : la chaine est : ,3
le reel entre est : 0

Dans cet essai, le programme exécuté ne s'arrête pas pour la saisie de
la variable chaîne. L'affichage de cette variable est donc aléatoire.


2eme essai :

Entrez un reel a virgule : 5
le reel entre est : 5
Entrez un 2eme reel a virgule : 2,35
la chaine est : 2,35
le reel entre est : 2


Si quelqu'un pouvait me denner une idée, une piste...
Merci d'avance.



Bonjour,

Essaye avec un point plutôt qu'une virgule ...

:/tmp$ g++ test.cpp
:/tmp$ ./a.out
Entrez un reel a virgule : 5.4
le reel entre est : 5.4
Entrez un 2eme reel a virgule : -42.8
la chaine est : -42.8
le reel entre est : -42.8

:/tmp$ ./a.out
Entrez un reel a virgule : 5,4
le reel entre est : 5
Entrez un 2eme reel a virgule : la chaine est : ,4
le reel entre est : 0
C'est normal, ',' ne fait pas partie d'un nombre, donc "5" est le nombre, et
",4" est gardé en cache. Par contre, c'est une chaîne, donc il est utilisé (avec
le '4' qui suit), mais atof ne sait pas traduire ",4" donc renvoie 0.

--
Bastien Durel.

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
news
Vincent Marchal wrote:

1er essai :

Entrez un reel a virgule : 2,3
le reel entre est : 2
Entrez un 2eme reel a virgule : la chaine est : ,3
le reel entre est : 0



Avec 2.3 ca fonctionne (chez moi, oui)?
Je soupconne un probleme d'internalisation...

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.
Avatar
Michel Arboi
On Tue Aug 02 2005 at 12:22, Vincent Marchal wrote:

Le même programme fonctionne parfaitement sous un autre système unix
(SGI sous irix 6.5), c'est pourquoi je préfère poser la question sur un
forum linux, plutôt que sur forum C++



AMHA, ton problème vient des "locale". J'ai essayé de mettre LC_ALL
ou LC_NUMERIC à "fr_FR", mais ça ne change rien.

Entrez un reel a virgule : 2,3
le reel entre est : 2
Entrez un 2eme reel a virgule : la chaine est : ,3
le reel entre est : 0



Si tu entres 2.3 et .3, ça marche. Avec des virgules au lieu de
points, ça foire.

Hopant avoir helpé...

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.