wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 2

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» FormatV, va_list et unicode...
Conversation : FormatV, va_list et unicode...
24-03-2012 19:02:58  FormatV, va_list et unicode... #1
hx (Membre)
Inscrit le : 21-09-2010
Messages: 35
Snippets: 0
Tutoriels: 0
Hors ligne
Salut, (ou Re)

J'essaye de coder des fonctions de sortie pratique mais je tombe sur un problème:

Je souhaite écrire cette fonction :

Code Cpp:

void DbgMsg(wxString msg,...)
{   
    va_list args;
      va_start(args, msg);     
    AddLog(LOG_DEBUG, wxString::FormatV(msg,args));
    va_end (args);        
}
 


Et je souhaite pouvoir l'utiliser simplement, sans encapsuler autrement qu'avec le préfixe de traduction _()


Exemple:

Code Cpp:

...
wxString tmp="Test 1";
...
DbgMsg("Test: %s, %s, %s", tmp, "Test 2", _("Test 3"));
...


Pour le moment je me retrouve avec les fameux "carrés" dans ma listview qui sert de log pour les arguments 2 et 3...
j'ai le double de carrés (que de caractères), c'est donc bien l'unicode ?


Si je résume, ceci ne fonctionne pas correctement

Code Cpp:

...
DbgMsg("%s""Test");
...


J'ai bien essayé un :

Code Cpp:

...
DbgMsg("%s", wxT("Test") );
...
 

Ca marche, mais c'est super lourding et pourtant, AddLog(LOG_DEBUG, wxString::Format("%s","Test") ); fonctione bien

Bref,

Je n'ai pas trop envis de faire :

Code Cpp:

DbgMsg(wxString::Format("J'ai trouvé %d trucs à %s près de %s !",trucCount,_("Wagadougou"),trucLocation ));
DbgMsg("j'ai trouvé " + wxString::Format("%d",trucCount) + " truc à " + _("Wagadougou") + " près de '" + trucLocation + "' !");


Je souhaite faire directement sans me poser de question

Code Cpp:

DbgMsg("J'ai trouvé %d trucs à %s près de %s !",trucCount,_("Wagadougou"),trucLocation );


Est ce que quelqu'un a un tuyau ?

Merci d'avance

Dernière modification par hx (24-03-2012 19:04:45)

25-03-2012 10:35:06  Re: FormatV, va_list et unicode... #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1387
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Salut.

Est-ce qu'à tout hasard, le problème ne viendrait pas du fait que tu n'utilises pas le préfixe de traduction _("") (ni le préfixe de non-traduction _T("") ) pour la première chaîne de caractères ?
Ça ne pose pas de problème à la compilation car je suppose que tu es sous wxWidgets 2.9.x

En tout cas, avec wxWidgets 2.8.12, impossible de compiler.
Et en mettant le préfixe pour la première chaîne de caractères, ça marche nickel !

Autre piste de recherche : si tu es en Unicode, assure-toi que l'encodage de tes fichiers sources correspond.

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
25-03-2012 14:00:59  Re: FormatV, va_list et unicode... #3
hx (Membre)
Inscrit le : 21-09-2010
Messages: 35
Snippets: 0
Tutoriels: 0
Hors ligne
Salut Xaviou,

Merci encore de m'aider, effectivement, bonne intuition (désolé de ne pas avoir précisé), je suis bien sur un XP avec une 2.9.1 & gcc 4.5.1 (tdm-1)

Cela ne fonctionne pas avec le préfixe de traduction:

Code Cpp:

error: cannot pass objects of non-trivially-copyable type 'const class wxString' through '...'|


Je vais faire un sample pour mettre en évidence mon soucis, je reviens

A++
----------
Salut,

Je viens de faire un essai avec la 2.8 et la 2.9 et je n'arrive pas à faire ce que je veux :)
J'ai soit des problèmes de compilation soit des problèmes d'affichage.

v2.9 (Je me concentre sur les version  >2.9.0)
http://www.wildwood.fr/images/tmp/vargsres29.png

V2.8 (Version que j'ai abandonnée)
http://www.wildwood.fr/images/tmp/vargsres28.png

Le sample ici
http://www.wildwood.fr/images/tmp/vargsdemo.zip

Pour résumer :

J'ai créé un méthode 'AddLog' toute simple

Code Cpp:

void vargsdemoDialog::AddLog(wxString msg)
{
   m_txtLog->AppendText(wxT("\n> ") + msg);
}


Je souhaite formater mes messages grâce à cette fonction pratique 'MsgInfo'

Code Cpp:

void vargsdemoDialog::MsgInfo(wxString msg, ...)
{
    va_list args;
    va_start(args, msg);
    AddLog(wxString::FormatV(msg,args));
    va_end (args);
}


Voici les essais effectués, voir aussi les résultats en image ci dessus

Code Cpp:

void vargsdemoDialog::OnDo(wxCommandEvent &event)
{
    //wx2.9>Compilation OK
    //wx2.8>error: call of overloaded 'wxString(const char [7])' is ambiguous
    wxString rawstr("rawstr");
    //wx2.9>Compilation OK
    wxString wxstr(wxT("rawstr"));
    wxString lngstr(_("rawstr"));
 
    //wx2.9>Compilation OK
    //wx2.8>error: conversion from 'const char [7]' to 'wxString' is ambiguous
    MsgInfo("Test 1");
    //wx2.8>Compilation OK
    MsgInfo(wxT("Test 2"));
    MsgInfo(_("Test 3"));
 
    //wx2.9>Compilation OK
    //wx2.8>error: conversion from 'const char [14]' to 'wxString' is ambiguous
    MsgInfo("Test 4 : '%s'", "Testing");
    MsgInfo("Test 5 : '%s'", wxT("Testing") );
    //wx2.9>error: cannot pass objects of non-trivially-copyable type 'const class wxString' through '...'|
    //MsgInfo("Test 6 : '%s'", _("Testing") );
 
    //wx2.9>error: cannot pass objects of non-trivially-copyable type 'class wxString' through '...'|
    //MsgInfo("Test 7 : '%s'", rawstr);
    //MsgInfo("Test 8 : '%s'", wxstr);
    //MsgInfo("Test 9 : '%s'", lngstr);
 
    //wx2.9>error: cannot pass objects of non-trivially-copyable type 'class wxCStrData' through '...'|
    //wx2.8>error: conversion from 'const char [15]' to 'wxString' is ambiguous
    //MsgInfo("Test 10 : '%s'", rawstr.c_str());
    //MsgInfo("Test 11 : '%s'", wxstr.c_str());
    //MsgInfo("Test 12 : '%s'", lngstr.c_str());
 
    //wx2.9>Compilation OK
    //wx2.8>error: conversion from 'const char [15]' to 'wxString' is ambiguous
    MsgInfo("Test 13 : '%s'", (const char *)rawstr.c_str());
    MsgInfo("Test 14 : '%s'", (const char *)wxstr.c_str());
    MsgInfo("Test 15 : '%s'", (const char *)lngstr.c_str());
 
    //wx2.9>Compilation OK
    MsgInfo("Test 16 : '%s'", (const char *)rawstr);
    //wx2.8>error: invalid cast from type 'wxString' to type 'const char*'
    MsgInfo("Test 17 : '%s'", (const char *)wxstr);
    MsgInfo("Test 18 : '%s'", (const char *)lngstr);
 
 
}
 


Voila, merci d'avance pour le coup de main...

A++

Dernière modification par hx (25-03-2012 15:44:54)

26-03-2012 18:10:02  Re: FormatV, va_list et unicode... #4
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1387
Snippets: 25
Tutoriels: 6
Site web
Hors ligne
Bon, j'ai testé ton exemple, et je pense avoir trouvé d'où vient le problème.

Il vient tout simplement du fait que tu passes un tableau de char en paramètres secondaires.
Je m'explique :
Depuis wxWidgets 2.9.0, il n'y a pas de différence à utiliser de simples guillemets ou l'une des macros _(""), _T(""), wxT("") pour spécifier un wxString.

Par contre, en interne, il y a tout un processus de conversion qui s'engage, suivant la formule que tu utilises.
Donc, pour le premier paramètre de ta fonction MsgInfo, ça n'a pas d'importance (la conversion est automatiquement mise en place du fait que tu aies spécifié wxString comme type de paramètre).

Par contre, pour les éventuels paramètres suivants, comme il n'y a pas de type spécifié, la conversion ne se fait pas automatiquement.
Elle ne se fera que si tu utilises l'une des 3 macros ci-dessus.
C'est donc pour ça que le test 4 ne fonctionne pas.

Pour les tests 13 à 18, le problème vient du fait que tu faits un cast vers un "const char *". Tu te retrouves avec le même problème qu'au numéro 4.
De plus, si tu lis la doc officielle, il est bien spécifié que wxString.c_str() ne peut pas être converti en char* ou wchar_t*, mais qu'il faut pour cela utiliser char_str() ou wchar_str() (mais j'ai testé, et ça ne compile carrément pas).
Par contre, avec wxString::fn_srt(), plus de problème.

Il va à mon avis falloir que tu t'impose un peu de rigueur, et utiliser l'une des 3 macros, ou fn_str() dans le cas d'une variable wxString.

@+
Xav'

Le nouveau portail wxWidgets francophone : www.wxdev.fr
Ben en fait, vous y êtes déjà... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
26-03-2012 21:08:33  Re: FormatV, va_list et unicode... #5
hx (Membre)
Inscrit le : 21-09-2010
Messages: 35
Snippets: 0
Tutoriels: 0
Hors ligne
Salut Xaviou,

Merci encore une fois d'avoir pris le temps de comprendre.
Je vais faire quelques tests pour bien comprendre tes explications et je ne connaissais pas le fn_str(), mais c'est déja un peu plus clair pour les comportements différents 2.8/2.9.

Je m’aperçois que la méthode que j'essaye éperdument d'utiliser (le printf'like) est fortement inspiré de mes habitudes "C", je me rends compte que ce n'est peut être pas la plus judicieuse en C++ (mais je trouve ça pratique) du coup j'ai une question un peu bête :

Quelle est la méthode la plus pratique pour formater rapidement les outputs mixte (chaine, entier, flotant) ? (avec la souplesse d'affichage du printf like ?) et pouvoir traiter le tout comme une chaine ?

Encore merci pour ton aide

PS : je n’oublierais pas le "accepter" ce coup là mais je veux faire quelques tests avant
----------
Salut,
Je continus mes investigations, j'utilise un 'wxString::Format' pour le moment (le pire c'est qu'il s'en sort bien avec des chaines en char* de base...je reviens dès que j'ai du nouveau
A++

Dernière modification par hx (29-03-2012 15:49:09)

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Utilisation générale wxWidgets
» FormatV, va_list et unicode...