Myriad Blog 1.3.0 Sunday, Apr 20th, 2014 at 10:35am 

Monday, Jun 20th, 2011 at 05:02pm
Acam III, version Ubuntu, étape 44

 
Un peu lassés de buter pendant des jours sur quelques points critiques (synchros MIDI, saisies complexes au clavier, etc), nous nous sommes un peu détendus en s'attaquant à d'autres fonctions pas encore écrite ou pas complètement fonctionnelles.
 
Ainsi, nous avons finalisé la gestion des pointeurs souris, la vérification des périphériques de sortie utilisés par une partition, avons géré le presse-papier, qui permet de coller dans Melody des textes copiés depuis une autre application Linux (et vice-versa), et avons arrangé l'export MP3.
 
Au sujet de cet export, justement, en tant que programmeurs assez expérimentés, nous sommes restés bouche bée devant le comportement de certaines fonctions C sur Linux.
Le C, qui est destiné à être portable, utilise en interne le point décimal (.) pour séparer la partie entière de la partie à virgule des nombres. Ainsi, 4 et demi s'écrit 4.5
 
Plusieurs des fichiers de données de Melody (tables MP3, voix Virtual Singer, etc) sont en fait des fichiers au format texte contenant de telles valeurs.  
 
Lors de la lecture de ces fichiers, le programme tronquait des valeurs, puis plantait lamentablement. Ce n'est qu'après quelques heures de recherche que nous nous sommes rendu compte que le programme attendait comme séparateur une virgule et non un point, puisque notre système est en français. Il a fallu explicitement fixer le séparateur à "." pour que cela fonctionne ! Du jamais vu, sur aucun des systèmes que nous ayons pu rencontrer ces 20 dernières années.
 
Cela a sans doute des conséquences sur le fonctionnement de pas mal de programmes. Si un programmeur américain écrit, dans un programme GTK, quelque chose d'aussi basique que :
Code:
if(atof("4.5")>4.0) printf("All right");

son programme fonctionnera chez lui mais pas en France... Si nous avions été anglophones, nous ne nous en serions probablement aperçus que lors du signalement de problèmes de quelques clients étrangers. Rassurez-moi, il y en a d'autres, des monstruosités comme celles-là?
by Olivier Guillion
Comments

Comment from Vous avez dit bizarre ? Monday, Jun 20th, 2011 at 05:24pm
Le luxe Linux
Chez les 0,8% de "linuxiens" non professionnels, le débat fait rage :
 
http://forum.ubuntu-fr.org/viewtopic.php?id=195324
 
Il y aurait (au conditionnel) une clé de conversion dans ce qui tient lieu de registre, et chose rigolote, Wine, à l'inverse de Ubuntu, fonctionnerait ... avec le point décimal...

Comment from Sylvain Monday, Jun 20th, 2011 at 05:26pm
sur Windows
Au boulot, nous avons dû mettre le "." comme séparateur décimal sur tous les postes, sinon certains programmes avaient vraiment du mal

Comment from Olivier Guillion Monday, Jun 20th, 2011 at 06:02pm
Point virgule
Sur le fond, ce n'est pas complètement idiot, de permettre de travailler sur des nombres avec la virgule "locale". Une option permettant de l'activer, OK, mais pas un tel fonctionnement par défaut dans un programme C, quand même... !
 
Sur un tableur, un outil de calcul, ou en programmation sur des plateformes/framework plus ou moins propriétaires, pourquoi pas, si c'est suffisamment bien indiqué dans les docs. Mais dans les programmes en C, avec aucun renvoi vers setlocale depuis le man de scanf...
 
Bon, il faut dire que ça a l'ait de se produire dès que GTK est initialisé. Ce serait donc la faute à GTK et pas à GCC, mais quand même, y'a de l'abus, et on se retrouve avec des bizarreries encore plus zarbi du type:
printf("%.2f",4.5)
qui affiche 4,5 alors que le séparateur, dans le format du printf, doit être un ".", et dans la valeur littérale aussi...

Comment from Gilbert Rouquié Monday, Jun 20th, 2011 at 06:34pm
Séparateur Décimal
Je crois me souvenir que ce comportement, comme bien d'autres - le tri de chaines de caractères, les messages - sont gérés par la 'locale' courante.
 
La 'locale' courante est directement issue de la variable d'environnement LANG, mais vous pouvez la surcharger à votre convenance avec setlocale(). Pour connaitre toutes les variables d'environnement liées à la locale, tapez 'locale' sans argument en ligne de commande. En jouant sur ces variables, vous pouvez choisir assez finement les fonctionnalités utiles et inutiles pour Harmony. Pour connaitre les locales installées dans votre Linux, tapez 'locale -a'.
 
Et pour un premier temps, rien ne vous empêche de simuler le retour à la locale minimale pour faire fonctionner Harmony :
LANG=C ./harmony ...
en ligne de commande.
 
Sincèrement

Comment from Olivier Guillion Monday, Jun 20th, 2011 at 11:48pm
Locale
Oui, absolument. Il y a même une fonction en librairie C pour faire ça. De mémoire : setlocale(LC_DECIMAL,"C") qu'il suffit de mettre au début du programme, après les initialisations de GTK, pour que tout fonctionne.
 
Ce qui nous a défrisés, c'est que ce ne soit pas le comportement par défaut, comme on pourrait s'y attendre, et comme c'est le cas sur tous les autres systèmes. Ceci rend le comportement de programmes simples et supposés portables (lecture de données dans des fichiers textes) complètement erratiques.


Most recent first
Oldest first

Top of page
Last update:  (c) Myriad 2013