OVH Cloud OVH Cloud

OutputDebugString style "sprintf"

46 réponses
Avatar
stat
Bonjour,

J'ai besoin d'aide pour creer une fonction de type OutputDebugString
qui envoit un message de debuggage mais qui soit aussi facile a
utiliser que printf c'est a dire que je puisse l'utiliser de la sorte

OutputDebugStringExt("Valeur x: %i, valeur y: %i, Nom: %s\n", x, y,
Nom);

et j'avoue ne pas savoir du tout comment m'y prendre

Avez-vous une idee pour commencer svp ?

Merci.

--
This is an automatic signature of MesNews.
Site : http://www.mesnews.net

10 réponses

1 2 3 4 5
Avatar
Sylvain
Michel Decima wrote on 26/11/2006 19:29:

Ca me rappelle l'histoire d'un systeme d'exploitation dont on excuse
souvent l'instabilité récurrente par la mauvaise qualité des drivers
fournis par des vendeurs tiers. Merci de la confirmation.


moi ça me rappelle un pitoyable vive-vista-que-voila, article
prétendument technique qui nous expliquait tous les bienfaits de cet OS
qui, hélas, trois fois hélas, mais ma brave dame, ne pouvait rien contre
les buffer overflow parce que ?? quoi d'ailleurs, des générations de
codeurs ont fait exprès des BO et qu'il ne faut pas les priver de leur
jouet favori ?

merci pour cet aparté HS, mais cela ne change rien au fait que l'on
puisse utiliser un xxprintf() intelligemment et faire des anneries avec
des "libs pas interdites" (même si c'est plus facile avec les premières).

Sylvain.

Avatar
Jean-Marc Bourguet
Sylvain writes:

Jean-Marc Bourguet wrote on 26/11/2006 17:59:
[...]

s'il faut lire, moi qui indique sprintf(..., std::string); reponse non, ni
moi, ni personne.


J'ai donc d.AN{ mal te comprendre. Qu'as-tu voulu dire?

ailleurs, ie .AN` une fonction variadique prNivu pour, cela sera dNifini, par
ce que fait la fonction justement.
Tu peux m'instruire en la mani.ANhre d'Nicrire une fonction variadique N`

laquelle on peut passer une instance? Je pensais que 5.2.2/7 (If the
argument has non-POD class type, the behavior is undefined.) .ANitait assez
d.ANifinitif sur Nga, mais je ne connais pas la norme dans son entiNhretNi et ai
pu manquer le paragraphe qui donne un cas o.ANy c'est possible.


tu vois c'est un peu ce qui ""m'agace"" dans ce type de r.ANiponses: c'est
dans dans un paragraphe X que je peux te balancer .AN` la tronche (toi ignare
qui ne connait pas la norme par coeur, en effet j'ai autre chose .AN` foutre),
donc tu es nul, .ANga ne peut pas exister, etc, etc, ....


J'ai du mal .AN` comprendre ta sortie... nous ne sommes pas d'accord sur un
point technique (je pr.ANitends que de passer une instance d'une classe
non-POD .AN` une fonction variadique quelle qu'elle soit est un comportement
ind.ANifini; tu prNitends le contraire). Je cite donc une rNifNirence qui me
semble appuyer mon propos en pr.ANicisant qu'il est possible que j'ai manquNi
quelque chose qui compl.ANhte la rNifNirence en introduisant un cas particulier
-- les exemples dans la norme de ce genre de choses sont l.ANigions.

Je m'attendais .AN` ce que tu cites quelque chose appuyant ton point de vue
(pas n.ANicessairement la norme -- pour moi c'est la rNifNirence oNy c'est le
plus ais.ANi de trouvNi quelque chose et la plus facile N` citer parce qu'elle
est sous forme de pdf) mais tu me traites d'ignare, .AN` moins que tu ne
consid.ANhres que je t'ai traitNi d'ignare?

mais vos codes ne sont que des recopies des samples de la norme ou
quoi?????


Non.

tiens un petit sample non-dans-la-norme si .ANga t'instruit.


Qu'est-ce qu'il est sens.ANi me montrer? Il fonctionnerait comme tu
l'attendais que .ANga prouverait quoi? Le propre des comportements indNifinis
c'est d'.ANjtre sujet N` la loi de Murphy...

Ce qui est vraissemblablement le cas ici. Apr.ANhs correction des erreurs et
omissions, il me reste

sylvain.cc: In function $B!F(Blong int sum(Entier, ...)$B!G(B:
sylvain.cc:19: warning: cannot receive objects of non-POD type $B!F(Bclass Entier$B!G(B through $B!F(B...$B!G(B; call will abort at runtime
sylvain.cc: In function $B!F(Bint main()$B!G(B:
sylvain.cc:28: warning: cannot pass objects of non-POD type $B!F(Bclass Entier$B!G(B through $B!F(B...$B!G(B; call will abort at runtime
sylvain.cc:28: warning: cannot pass objects of non-POD type $B!F(Bclass Entier$B!G(B through $B!F(B...$B!G(B; call will abort at runtime
sylvain.cc:28: warning: cannot pass objects of non-POD type $B!F(Bclass Entier$B!G(B through $B!F(B...$B!G(B; call will abort at runtime

Et quand j'ex.ANicute, effectivement Nga plante. PlutNtt gentil pour un
comportement ind.ANifini: avertissement au niveau de warning le moins NilevNi et
plantage assur.ANi. Et ce mNjme aprNhs avoir passNi le premier paramNhtre par
valeur plut.ANtt que par rNifNirence (Nga n'empNhche pas la compilation mais il y
a des contraintes en C sur le dernier param.ANhtre avant l'ellipse et la
technique habituelle d'impl.ANimentation -- cast violent en prenant l'adresse
du param.ANhtre -- ne doit pas trop apprNicier une rNifNirence -- l'adresse prise
n'est potentiellement plus dans la pile).

Mais .ANga ne m'instruit pas (si: mon compilateur averti sur ce comportement
ind.ANifini, ce dont je ne me souvenais pas), Nga confirme ce que j'Nicrivais.

(J'ai 4 compilateurs sous la main, deux des autres compilateurs avertissent
mais g.ANinNhrent un exNicutable ayant apparemment le comportement auquel tu
t'attendais, le troisi.ANhme fait de mNjme sans avertissement aucun.).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Loïc Joly
James Kanze wrote on 26/11/2006 17:50:


qui a parlé de la compétence des auteurs de string ou de C99 ???



Tu as critiqué l'absense d'une conversion implicite dans
std::string.



je me cite:

?! parce qu'il n'a pas d'opérateurs de coercion vers const char* ?


si *tu* considères cette question comme un e "critique", *tu* as un
problème, pas moi.


Je pense qu'il faisait référence à la ligne juste en dessous, je te cite :
une raison de plus (pour moi) de ne pas l'utiliser.


--
Loïc



Avatar
Sylvain
Loïc Joly wrote on 27/11/2006 00:46:
James Kanze wrote on 26/11/2006 17:50:


qui a parlé de la compétence des auteurs de string ou de C99 ???



Tu as critiqué l'absense d'une conversion implicite dans
std::string.



je me cite:

?! parce qu'il n'a pas d'opérateurs de coercion vers const char* ?


si *tu* considères cette question comme un e "critique", *tu* as un
problème, pas moi.


Je pense qu'il faisait référence à la ligne juste en dessous, je te cite :
une raison de plus (pour moi) de ne pas l'utiliser.



et ??? t'as aussi un problème avec le français ??????????

exemple:
"pour aller au boulot, un 38 tonnes ne me va pas trop.
"ah, en plus il faut un permis spécial ?!
"une raison de plus pour moi de ne pas l'utiliser (le 38 tonnes!)"

osant dire cela je dois en toute logique m'attendre à avoir RVI et
autres fabricants de poids lourds sur le dos, puisque je les ai "critiquer".

tout ceci est d'un intérêt !...

Sylvain.




Avatar
Gabriel Dos Reis
Sylvain writes:

| Jean-Marc Bourguet wrote on 26/11/2006 20:43:
| > Sylvain writes:
| >
| >> Jean-Marc Bourguet wrote on 26/11/2006 17:59:
| > [...]
| >> s'il faut lire, moi qui indique sprintf(..., std::string); reponse non, ni
| >> moi, ni personne.
| > J'ai donc dû mal te comprendre. Qu'as-tu voulu dire?
|
| hmmm, qu'as-tu voulu me préter ?

Finalement tu lis le japonnais ?

-- Gaby
Avatar
Sylvain
Gabriel Dos Reis wrote on 27/11/2006 02:16:

Finalement tu lis le japonnais ?


oui, il suffisait de tourner d'un 1/4 de tour, mon 24" est sur pivot.

Sylvain.

Avatar
Jean-Marc Bourguet
Sylvain writes:

Jean-Marc Bourguet wrote on 26/11/2006 20:43:
[...]


désolé je ne lis pas le Japonais; encodage ISO-2022-jp-2 obfuscant pour mon
mailer.


Merci de l'info, je vais en chercher la cause.

--
Jean-Marc


Avatar
Jean-Marc Bourguet
Sylvain writes:

J'ai du mal à comprendre ta sortie... nous ne sommes pas d'accord sur un
point technique (je prétends que de passer une instance d'une classe
non-POD à une fonction variadique quelle qu'elle soit est un comportement
indéfini; tu prétends le contraire).


pour une tache donnée, j'utilise un compilateur donné, ce compilateur est
déterministe (il n'écoute pas l'horoscope, se moque du sens du vent etc);
quand je lui soumets un code donné, il a une réponse définie.


Indefini ne veut d'ailleurs pas dire aleatoire ni non deterministe. Ca
veut dire que la norme n'impose rien aux implementations; et en pratique ca
veut dire que les implementations ne le definissent souvent pas et se
permettent de changer de comportement d'une version a l'autre ou en
fonctions de facteurs qu'elles ne prennent pas la peine d'annoncer.

"comportement indéfini" n'a aucun sens dans cette logique; surement cela en
a un dans un exercice scolaire ou pour une spéculation futuriste; je ne me
place pas dans ces cas.


Le code que j'ecris est delivre avec 3 compilateurs differents (c'etait 4
il n'y a pas si longtemps). De ces 3 compilateurs, 2 donnent un
avertissement et un genere du code qui plante. Ce n'est pas un exercice
scolaire ni une speculation futuriste.

Par ailleurs, j'ai perdu trop de temps a chercher des problemes qui etaient
dus a des comportements indefinis qui faisait ce que le programmeur initial
-- moi parfois -- pensait dans la configuration dans laquelle ca avait ete
teste. Mais ce n'etait pas le cas en changeant de systeme, de version du
compilateur, d'options diverses (niveau d'optimisation, 32/64 bits, ...) ou
meme simplement du code apparemment non lie. Ce n'etait pas non plus un
excercice scolaire ni une speculation futuriste.

Mais je suis en effet tout a fait hors de la logique qui consiste a code en
fonction de ce que le compilateur que j'ai sous la main a l'air de faire.
Utiliser cette logique serait dans mon cas tout a fait irresponsable.

Je cite donc une référence qui me semble appuyer mon propos en
précisant qu'il est possible que j'ai manqué quelque chose qui complète
la référence en introduisant un cas particulier -- les exemples dans la
norme de ce genre de choses sont légions. Je m'attendais à ce que tu
cites quelque chose appuyant ton point de vue (pas nécessairement la
norme -- pour moi c'est la référence où c'est le plus aisé de trouvé
quelque chose et la plus facile à citer parce qu'elle est sous forme de
pdf) mais tu me traites d'ignare, à moins que tu ne considères que je
t'ai traité d'ignare?


option 2 (non prise à titre personnel).


J'ai du mal a suivre ton raisonnement...

ah ok, ça ne marche que dans 75% des cas, on va donc dire que le quart
restant est le bon compilateur pour les personnes n'ayant pas toujours
conscience de ce qu'elles codent et ont besoin d'un compilateur strict
même si cela peut limiter les codages possibles.


Mais le compilateur qui gene est celui que nous utilisons pour une des
plateformes sur lesquelles nous delivrons, que tu le veuilles ou non. Donc
ca n'a meme pas assez l'air marcher pour pouvoir passer en production sans
etre detecte des que c'est utilise. Par ailleurs, le compilateur sur
lequel le code a l'air de faire ce que tu veux (je n'ai pas trouve la
garantie dans la doc et j'ai deja ete pris par ce genre de choses) sans
donne un seul avertissement est au contraire renomme pour sa rigueur.

A+

--
Jean-Marc


Avatar
James Kanze
Sylvain wrote:
[...]
pour une tache donnée, j'utilise un compilateur donné, ce compilateur
est déterministe (il n'écoute pas l'horoscope, se moque du sens du ve nt
etc); quand je lui soumets un code donné, il a une réponse définie.


On voit que tu ne connais pas très bien les compilateurs. Sa
réponse définie dépend bien du contexte, le nombre de régistres
utilisés par ailleurs, etc. Du coup, la même ligne de code ne
génère pas toujours les mêmes instructions, même sans
l'optimisation. Et avec l'optimisation, évidemment...

Et évidemment, même avec les mêmes instructions, tu n'es pas
garanti un déterminisme absolu ; l'ordre des écritures en
mémoire peut varier selon qu'on a eu une interruption
immédiatement avant ou non, par exemple. (Mais ces effets-là, tu
ne voit normalement que dans des programmes multithreads. Le
processeur s'arrange pour que tout ce qui se passe dans un seul
thread ait l'air cohérent.)

Sans parler du fait que je n'ai pas constamment réinventé la
roue, et que j'utilise couramment du code développé sous Solaris
sur Linux ou sur Windows. On me l'exige même ; tous les projets
doivent se servir des mêmes bibliothèques de base.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Jean-Marc Desperrier
Sylvain wrote:
static char message[2048];
_vsnprintf(message, 2048, pattern, params);
[...]
OutputDebugString(message);


N'y a-t-il pas une astuce comme quoi sur certaines implémentations il
n'est pas garanti que vsnprintf va écrire le zéro terminal quand le
buffer déborde ?

1 2 3 4 5