Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problème avec float_of_string en utilisant lablgtk #2675

Closed
vicuna opened this issue Feb 4, 2001 · 2 comments
Closed

Problème avec float_of_string en utilisant lablgtk #2675

vicuna opened this issue Feb 4, 2001 · 2 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Feb 4, 2001

Original bug ID: 275
Reporter: administrator
Status: closed
Resolution: not a bug
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Full_Name: Maxence Guesdon
Version: OCaml 3.00 + lablgtk 1.00
OS: Linux 2.2.x
Submission from: paris11-nas4-47-165.dial.proxad.net (212.27.47.165)

Je rencontre un pb avec la fonction float_of_string : elle
ne semble pas utiliser le même séparateur entre la partie
entière et la partie décimale, selon que l'on utilise ou
non lablgtk.
Un petit programme exemple :
(**********************************)
print_string "Avec le point:\n";;
let un_point_deux = "1.2";;
let f_un_point_deux = float_of_string un_point_deux;;
print_string un_point_deux;;
print_string " = ";;
print_string (string_of_float f_un_point_deux);;
print_string "\n";;
print_string (un_point_deux^" + 1.0 = ");;
print_string (string_of_float (f_un_point_deux +. 1.0));;
print_string "\n";;

print_string "Avec la virgule:\n";;
let un_virgule_deux = "1,2";;
let f_un_virgule_deux = float_of_string un_virgule_deux;;
print_string un_virgule_deux;;
print_string " = ";;
print_string (string_of_float f_un_virgule_deux);;
print_string "\n";;
print_string (un_virgule_deux^" + 1,0 = ");;
print_string (string_of_float (f_un_virgule_deux +. 1.0));;
print_string "\n";;
(**********************************)

En faisant

ocamlc test.ml
./a.out

on obtient l'affichage suivant :
Avec le point:
1.2 = 1.2
1.2 + 1.0 = 2.2
Avec la virgule:
1,2 = 1
1,2 + 1,0 = 2

Donc, dans ce cas, float_of_string utilise le point comme séparateur.

Maintenant, utilisons le toplevel créé lors de la compilation de lablgtk:
En faisant
./lablgtktop test.ml

on obtient l'affichage suivant :
Avec le point:
1.2 = 1
1.2 + 1.0 = 2
Avec la virgule:
1,2 = 1,2
1,2 + 1,0 = 2,2

Dans ce cas, float_of_string utilise la virgule comme séparateur.
Le fait de charger les bibliothèques C gtk modifierait-il le comportement
de la fonction C atof ?

@vicuna
Copy link
Author

vicuna commented Feb 5, 2001

Comment author: administrator

Je rencontre un pb avec la fonction float_of_string : elle
ne semble pas utiliser le même séparateur entre la partie
entière et la partie décimale, selon que l'on utilise ou
non lablgtk.

Nouvelle reponse, parce que JitterBug a mal classee la precedente, et pour
repondre a` Xavier.

From: Xavier.Leroy@inria.fr

Oui, comme l'a dit Jacques, c'est un problème inattendu avec la
"localisation" de la bibliothèque C: GTK appelle setlocale(), ce qui
avec les variables de ton environnement (qui doit être "francisé")
change les règles de parsing des flottants utilisées par atof() !

Ca offre une premiere solution: fixer LC_NUMERIC=C dans l'environnement, ce
qui devrait eviter le probleme pour peu que l'implementation de setlocale
soit correcte. A moins que tu sois tres attache' a la notation francaise.

Je trouve quand même que GTK est un peu limite sur ce coup-là:
setlocale() ne devrait être appelé que par le programme principal, et
non par une bibliothèque. Aussi, l'interface de "localisation" de la
libc est mal fichue, mais c'est standard :-(

C'est pas de la faute de GTK, mais de la mienne. C'est moi qui appelle
setlocale systematique lors de l'initialisation de la bibliotheque, comme
le suggere le manuel de GTK. Ca me parait assez naturel: setlocale est un
mecanisme general, pourquoi devrait-il etre optionel. Un programme qui ne
l'appelle pas sera pour toujours incapable de traiter le japonais.
Mais je m'en vais ajouter une fonction d'initialisation qui n'appelle
pas set_locale (lablgtktop continuera de l'appeler).

Jacques Garrigue

@vicuna
Copy link
Author

vicuna commented Oct 30, 2001

Comment author: administrator

lablgkt (or the user's code) should not do setlocale(LC_ALL). It is just too
hard to "undo" the effects of localization on the C library functions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant