IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Windows] sprintf et "numbered arguments"


Sujet :

C++

  1. #1
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut [Windows] sprintf et "numbered arguments"
    Bonjour � tous,

    je suis actuellement entrain d�internationaliser des applications et j'ai une petite question. Nous utilisons Visual Studio 2010. Il existe des messages avec des param�tres.
    exemple: Connexion de %s sur le port %d.

    J'ai vu qu'il existait dans la fonction printf la possibilit� de sp�cifi� la position de l'argument � utiliser en utilisant le caract�re '$'. C'est appel� "numbered arguments". D'apr�s ce que j'ai pu trouver, il semble que cela soit une extension POSIX.
    (http://pubs.opengroup.org/onlinepubs...ns/printf.html)
    J'ai essayer pour �tre sur mais Visual Studio ne supporte pas cette extension du C.

    Je voudrait savoir s'il existe une solution similaire sous windows ?
    Ou existe un compilateur sous windows qui supporte cette extension ?
    (MinGw ne le supporte pas d�j� test�).

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Bonjour,

    Tu peux utiliser printf avec boost::bind et si je ne me trompe pas, il y a un �quivalant � boost::bind dans la norme C++11.

  3. #3
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Pour utiliser des arguments positionnels en C++ sans tomber dans els d�fauts de printf (pas typesafe, pas extensible pour des types utilisateurs...), je te conseille de jeter un �il vers boost.format.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  4. #4
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    J'ai regarder std::bind, cela ne correspond pas � mon besoin. En effet, il faudrait que je fasse un switch sur le identifiant de la langue ce qui me plaie vraiment moyen (voir pas du tout).

    L'objet boost::format par contre est tr�s int�ressant. Existe t'il en c++11 ?
    J'ai regarder mais pas encore trouver pour le moment.

  5. #5
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Non, boost.format n'a pas �t� inclus en C++11.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Peux-tu nous montrer exactement ce que tu cherches � faire et dans quel but?

  7. #7
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    Pour donner un exemple concret de message que nous affichons :
    Fran�ais : Erreur %s sur le port COM%d
    Chinois simplifi� : COM%d端口上发生%s错误

    Comme vous pouvez le voir les param�tres du format ne sont pas dans le m�me ordre. Ici, il ne s'agit que de deux param�tres mais on peut en avoir bien plus dans un ordre compl�tement al�atoire.

    Les arguments positionn�s semble �tre une tr�s bonne solution � ce probl�me.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Dans ce cas l�, pourquoi ne pas �crire :
    Erreur $1 sur le port COM$2

    Et remplacer la sous-cha�ne "$1" par la bonne valeur?
    C'est tout � fait possible pour un std::string, il suffit de rechercher la sous-cha�ne puis de remplacer cette sous-cha�ne par une autre sous-cha�ne.

  9. #9
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    L� j'arrive pas a vous suivre. Je vois bien rechercher la cha�ne $x de la ressource. Mais apr�s je vois pas vraiment comment vous voulez faire ?

    Note: La fonction qui charge la ressource est appel�e avec des param�tres variables ( void Display(ResId, ...); ).

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Inscrit en
    D�cembre 2011
    Messages
    9 026
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 32
    Localisation : France, Loire (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : Doctorant s�curit� informatique � Dipl�m� master Droit/�conomie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : D�cembre 2011
    Messages : 9 026
    Par d�faut
    Chercher ta sous-cha�ne : find_end
    Ins�rer ta valeur : std::string::replace

  11. #11
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    Au risque de para�tre b�te, je vois toujours pas comment vous faites. En effet, j'aimerai ne pas changer le prototype de la fonction. J'ai vraiment du mal � comprendre comment vous voyez l� chose sachant que je doit d�clarer un va_list.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    void DisplayV(int iResId, ...)
    {
      UStringRessource rstr(iResId);
      va_list param;
      va_start(param, iResId);
      ... // Je faisait wsprintf() ici
      va_end(param);
    }

  12. #12
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Je n'ai pas utilis� de va_list depuis un moment, mais il me semble qu'il faut mettre en place un syst�me de boucle pour parser les arguments.
    Qu'est-ce qui t'emp�che alors d'ajouter un compteur ?
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  13. #13
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Je n'ai pas utilis� de va_list depuis un moment, mais il me semble qu'il faut mettre en place un syst�me de boucle pour parser les arguments.
    Qu'est-ce qui t'emp�che alors d'ajouter un compteur ?
    C'est possible � condition de connaitre le type de chaque param�tre dans le va_list. Voir la macro va_arg.

    Finalement �a reviens � re-coder "printf()" ce qui n'est pas un mince � faire. C'est pour cette raison que je cherche une solution autre.

  14. #14
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par Kalite Voir le message
    Au risque de para�tre b�te, je vois toujours pas comment vous faites. En effet, j'aimerai ne pas changer le prototype de la fonction. J'ai vraiment du mal � comprendre comment vous voyez l� chose sachant que je doit d�clarer un va_list.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    void DisplayV(int iResId, ...)
    {
      UStringRessource rstr(iResId);
      va_list param;
      va_start(param, iResId);
      ... // Je faisait wsprintf() ici
      va_end(param);
    }
    Nope.

    Si tu utilise C++, il y a de bien meilleures fa�on de proc�der (boost.format n'utilise pas de varargs, et fonctionne pourtant tr�s bien : cf. l'explication donn�e dans http://www.boost.org/doc/libs/1_51_0...oc/format.html).
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  15. #15
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    Je vais lire attentivement la documentation d�s que possible. Merci pour l'info.

  16. #16
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Tel que je comprends format, tous les arguments sont finalement des string
    Ce qui est ce qui disait neckara plus haut, et tes vararg sont donc tous des const char*
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  17. #17
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    Suite � la lecture de la documentation de boost::format(), j'ai pas vraiment le choix pour faire ce que souhaite.

    Il faut que supprime la fonction avec les var_arg et que je modifie mon objet UStringRessource pour qu'il reprenne la syntaxe de boost::format(). (Operateur %)

    Mon seul probl�me c'est les formateurs (exemple: %02d) que j'avais avec sprintf. Il vas falloir que je trouve un moyen de les remplacer.

    Note: Au final, �a vas ce rapprocher d'un codage de la fonction printf().

  18. #18
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par Kalite Voir le message
    Suite � la lecture de la documentation de boost::format(), j'ai pas vraiment le choix pour faire ce que souhaite.

    Il faut que supprime la fonction avec les var_arg et que je modifie mon objet UStringRessource pour qu'il reprenne la syntaxe de boost::format(). (Operateur %)

    Mon seul probl�me c'est les formateurs (exemple: %02d) que j'avais avec sprintf. Il vas falloir que je trouve un moyen de les remplacer.

    Note: Au final, �a vas ce rapprocher d'un codage de la fonction printf().
    Oui, mais un codage typesafe, dans lequel tu n'as pas besoin de pr�ciser le type des variables attendues parce que, miracle, ils sont d�couvert par le compilateur

    Du coup, tu n'a qu'� parser quelque chose du style %n. Si tu souhaite ajouter des �l�ments de formatage, je te conseille de les mettre entre deux s�parateurs (par exemple: %4{02}). Ca va te simplifier le parsing, puisque tu sais que si il y a un { apr�s le nombre (ou avant ; c'est toi qui voit), alors il y a un formatage � faire ; si tu ne peux pas faire de formatage sur cette sortie, alors tu peux ignorer jusqu'au } suivant.

    Sans �a, tu seras oblig� de faire un parsing beaucoup plus compliqu�, sans compter les cas tordus ou tu risque fort d'�tre incapable de d�cider de ce que tu dois faire.

    Bien �videmment, si tu avais acc�s aux variadic templates, c'eut-�t� encore mieux
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  19. #19
    Membre �clair�
    Avatar de Kalite
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Octobre 2006
    Messages
    310
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 310
    Par d�faut
    Citation Envoy� par Emmanuel Deloget Voir le message
    Bien �videmment, si tu avais acc�s aux variadic templates, c'eut-�t� encore mieux
    J'ai juste vue que cela existait mais j'ai pas encore utilis� le concept. A cause du compilateur qui ne les supporte pas et parce que je ne me suis pas encore vraiment pench� sur le sujet.

    Merci � tous pour toutes ces infos.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    R�ponses: 8
    Dernier message: 05/01/2007, 19h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo