#0 

20-01-2013 15:01:40

Akabane87
Membre
Date d'inscription: 28-05-2012
Messages: 24

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


#1 

20-01-2013 18:36:15

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

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.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

20-01-2013 18:52:39

Akabane87
Membre
Date d'inscription: 28-05-2012
Messages: 24

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 :

Code c++ :

                    m_DialogSpeedSpinBox->getEditBox()->setText(L"1.00000");// je reset ma spin box à une valeur normale une fois le bug déclenché

                    f32 val = m_DialogSpeedSpinBox->getValue();// ma valeur est correct ici : je refais manuellement le code du onevent de la spinbox quand on l'incrément
                    val += 0.1f;
                    wchar_t str[100];
                    core::stringw FormatString = "%.";
                    FormatString += 5;
                    FormatString += "f";

                    // contenu du setValue de la spinBox
                    swprintf(str, 99, FormatString.c_str(), val);
                    m_DialogSpeedSpinBox->getEditBox()->setText(str);

                    // appel au verifyValueRange();
                    val = m_DialogSpeedSpinBox->getValue();
                    if ( val+core::ROUNDING_ERROR_f32 < m_DialogSpeedSpinBox->getMin() )
                        val = m_DialogSpeedSpinBox->getMin();
                    else if ( val-core::ROUNDING_ERROR_f32 > m_DialogSpeedSpinBox->getMax() )
                        val = m_DialogSpeedSpinBox->getMax();
                    // tout est ok avec ce code

                    // par contre si je fais ça via la fonction setValue de la dll ça me donne un float fucké avec une virgule
                    //m_DialogSpeedSpinBox->setValue(val);

Hors ligne


#3 

21-01-2013 14:25:04

Akabane87
Membre
Date d'inscription: 28-05-2012
Messages: 24

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


#4 

21-01-2013 14:55:46

Ikam
Membre
Date d'inscription: 16-05-2007
Messages: 56
Site web

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


#5 

21-01-2013 18:33:35

Akabane87
Membre
Date d'inscription: 28-05-2012
Messages: 24

Peut-être que ça tourne autour de ça mais en tous cas mon clavier est bien en fr avant et après déclenchement du bug. Et je ne fais rien de choquant dans mon code à part utiliser la gui d'irrlicht normalement.

Hors ligne


#6 

22-01-2013 12:26:29

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 904
Corrections: 2
Site web

bisard puisque la fonction setValue est identique a ce que tu fait, la seul difference c'est Formating

Code c++ :


FormatString(L"1.00000")

void CGUISpinBox::setValue(f32 val)
{
    wchar_t str[100];

    swprintf(str, 99, FormatString.c_str(), val);
    EditBox->setText(str);
    verifyValueRange();
}



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


#7 

27-01-2013 12:12:04

Akabane87
Membre
Date d'inscription: 28-05-2012
Messages: 24

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


#8 

27-01-2013 13:54:19

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 904
Corrections: 2
Site web

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


#9 

27-01-2013 14:42:06

Akabane87
Membre
Date d'inscription: 28-05-2012
Messages: 24

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


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
19 invités en ligne
Aucun membre connecté
RSS Feed