Bonjour tout le monde.
Je viens à vous aujourd'hui avec un problème assez foireux sur lequel je suis pas sûr d'avoir tous les éléments en main pour le comprendre.
Vous avez déjà surement tous remarqué que sur un windows français certains logiciels comme excel convertissent le point d'une nombre à virgule en virgule à l'affichage.
Ben voilà j'ai un peu le même problème avec mon programme sur irrlicht : j'ai des spinbox qui décident d'un coup de passez d'un affichage de point à un affichage de virgule. Ce qui pose un gros problème au moteur car la spinbox ne contient pas de valeur mais une chaine de caractère qui est transformée en float par une fonction (fastatof puis atof10) qui ne gère pas la virgule mais seulement le point. Du coup les flèches haut et bas de la spinbox génèrent une valeur batarde qui arrive même à sortir du range défini.
Ce problème de point qui devient virgule est commun à toute la gui et ne survient qu'à partir du moment où je fais une certaine action qui engendre entre autre l'ouverture d'une open dialog box... Et c'est là où je me dis WTF... Qu'est ce qui peut bien causer tout ce bazar... J'ai testé de mettre juste une spin box et une open dialog box dans un programme de test mais je ne repro pas le bug.
Je précise que j'ai ce bug avec toutes les version d'irrlicht (1.7.X comme 1.8). Quelqu'un aurait-il une idée du pourquoi du comment de la chose et comment le corriger ? J'ai bien pensé à gérer la virgule et le point dans la fonction atof10 mais c'est quand même un peu crade (et pis j'ai plus tous les sdk de directx 7 et 8 pour recompiler le moteur surtout xD).
Dernière modification par Akabane87 (20-01-2013 16:09:45)
Hors ligne
Pour ton problème de spin box, je ne sais pas mais pour ton histoire de DirectX prends le SDK de DX9. Il y a un tuto dessus. Parce qu'après tout dx 7 et 8 sont obsolètes depuis un bail.
Hors ligne
En fait je l'ai le sdk de dx9 mais il me demandait des fichiers .h de dx7 et 8 quand je compilais les sources d'irrlicht 1.7.3. Je viens de compiler irrlicht 1.8 sans problèmes avec juste le sdk dx9 donc du coup ce problème est réglé. Ceci dit j'ai rajouté aux directives de compil /Zi pour avoir les symboles d'irrlicht pour débugger correctement mais ça ne marche pas mieux. Visiblement il veut les pdb de la DLL et je ne sais pas comment les obtenir...
Du coup à la place j'ai debuggé à la warrior en filant directement à la spinbox diverses entrées bonnes ou mauvaises pour situer d'où vient le problème.
Et la conclusion est que c'est la fonction setValue() qui fait de la merde. J'ai mis un data breackpoint dans visual est la seule fonction qui modifie le texte de ma spinbox entre le moment où ma valeur est bonne et le moment où elle est fuckée est cette fonction.
Et si je refais manuellement le code du setValue il fonctionne correctement :
Hors ligne
Bon j'ai réussi a obtenir un fix de la part de cutealien sur le forum officiel mais je n'ai toujours pas d'explication potable sur comment et pourquoi les points sont transformés en virgules par le moteur mais pas dans le code si je réécris le même code... le mystèèèèère demeure ^^
Bug report sur le forum officiel :
http://irrlicht.sourceforge.net/forum/v … mp;t=48085
Hors ligne
ca serait pas suite à l'emploi d'une combinaison de touche qui par hasard changerait quelque chose dans la locale, genre le switch du clavier FR/EN (ctrl+shift ou alt shift je sais plus) ?
Dernière modification par Ikam (21-01-2013 14:56:26)
Hors ligne
bisard puisque la fonction setValue est identique a ce que tu fait, la seul difference c'est Formating
donc si la local interviens la dedans suffi de modifier Formating par L"%.16f" la spécification du '.' force peut-être la local us dans ce cas ? ...
donc essaye en spécifiant par setDecimalPlaces(5) ça devrait modifier Formating de ta CGUISpinBox en conséquence
je suis étonner, je n'ai jamais eux le soucis ...
Hors ligne
Mmmh j'ai pas trop compris où tu voulais en venir Magun. Je faisais déjà dans mon code ci-dessus le FormatString qui est d'ailleurs un copier coller lui aussi des sources d'irrlicht. En fait je fais exactement le même code qu'irrlicht lorsqu'il fait un setValue sauf que pour moi ça marche correctement mais pour l'appel au setValue ça passe en virgule française.
J'étais en train de me dire en écrivant tout ça que le pb vient forcément de la dll et soudain je souviens que je n'ai pas compilé moi même la lib ce qui pourrait vouloir dire que peut-être il y a un conflit en ma local et celle de celui qui a compilé la lib. Je vais essayer d'utiliser ma propre lib compilée plutôt que celle fournie et je vous tiens au jus.
Dans tous les cas la solution fournie par CuteAlien permet au moteur de gérer la virgule aussi bien que le point (avec la version 1.8 seulement) :
core::LOCALE_DECIMAL_POINTS = irr::core::stringc(".,");
Au passage quelqu'un sait comment on peut recompiler irrlicht.dll ?
edit: Au temps pour moi j'avais pas vu qu'elle était compilée avec le .lib dans le répertoire bin.
Donc je viens de tester avec mon .lib et mon .dll compilé sur ma machine et ça ne change rien xD je démarre avec des '.' et une fois la manip déclenchant le switch faite, j'ai des ',' de partout dès que je fais un setValue.
Dernière modification par Akabane87 (27-01-2013 12:48:27)
Hors ligne
la ou je veut en venir c'est que setDecimalPlaces modifi FormatString si le comportement devient correcte a l'apelle des cette fonctions c'est que c'est la spécification du '.' dans le formating qui force la locale us
après la locale n'est pas transmise l'or de la compilation je pencherais plus a une erreur dans ta locale
si tu tien a recompiler irrlicht tu a les fichier 'projet' codeblocks, visual studio et le makefile dans les source : "Irrlicht/source/Irrlicht/"
tu l'ouvre et ta juste a cliquer sur recompiler ...
Hors ligne
Je viens de tester le setDecimalPlaces() juste avant de faire un un setValue(getValue()); afin d'écraser la mauvaise valeur par une potentielle bonne valeur mais la valeur reste mauvaise quand même.
Donc le formating n'y est pour rien visiblement. Pour moi ça vient de la manière dont la locale est utilisée ou non dans l'exécutable de mon app et dans la dll d'irrlicht : le swprintf peut visiblement utiliser la locale transformant alors les '.' en ',' lorsqu'il est appelé depuis la dll, mais pas lorsqu'il est appelé directement depuis l'exécutable.
Pour moi la plus grande question reste qu'est ce qui provoque ce switch de '.' vers ',' dans la lib puisque le bug ne survient qu'à un certain moment dans mon app.
Vu que ni moi ni CuteAlien n'a le temps de se pencher sur la question je suppose que ça restera sans réponse (vu que seule mon app arrive à déclencher ce bug). L'essentiel c'est que mes spinboxes fonctionnent même avec des ','.
Hors ligne