PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.c++ > Output
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Output

Réponse
 
LinkBack Outils de la discussion
Vieux 07/03/2008, 12h08   #1
Guillaume GOURDIN
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Output

Bonjour à tous,

j'ai un problème, le code suivat :

uint8_t data1, data2;
cout << "0x" << hex << setw(4) << setfill('0') << data1 << "=";
cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl;

me sort l'output suivant :

0x00aa=0x0

alors que je m'attendrais (et que je voudrais) quelque chose du genre:

0x00aa=0x00

Vous avez des idées?
  Réponse avec citation
Vieux 07/03/2008, 12h24   #2
Jean-Marc Bourguet
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

Guillaume GOURDIN <trash@hotmail.com> writes:

> Bonjour à tous,
>
> j'ai un problème, le code suivat :
>
> uint8_t data1, data2;
> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "=";
> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl;
>
> me sort l'output suivant :
>
> 0x00aa=0x0
>
> alors que je m'attendrais (et que je voudrais) quelque chose du genre:
>
> 0x00aa=0x00
>
> Vous avez des idées?


Ce qui me surprend, c'est la partie aa. uint8_t est vraissemblablement un
typedef sur unsigned char et donc data1 et data2 devraient etre affiche
comme des caracteres, si data2 est \0, c'est pas trop etonnant que tu ne le
voie pas mais tu devrais etre capable de le verifier (piper dans od, sortir
vers un fichier et regarder avec un editeur hexa,...)

Essaie
cout << "0x" << hex << setw(4) << setfill('0') << unsigned(data1) << "=";
cout << "0x" << hex << setw(2) << setfill('0') << unsigned(data2) << endl;

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++/...ite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
  Réponse avec citation
Vieux 07/03/2008, 13h47   #3
Michel Decima
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

Jean-Marc Bourguet a écrit :
> Guillaume GOURDIN <trash@hotmail.com> writes:
>
>> Bonjour à tous,
>>
>> j'ai un problème, le code suivat :
>>
>> uint8_t data1, data2;
>> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "=";
>> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl;
>>
>> me sort l'output suivant :
>>
>> 0x00aa=0x0
>>
>> alors que je m'attendrais (et que je voudrais) quelque chose du genre:
>>
>> 0x00aa=0x00
>>
>> Vous avez des idées?

>
> Ce qui me surprend, c'est la partie aa. uint8_t est vraissemblablement un
> typedef sur unsigned char et donc data1 et data2 devraient etre affiche
> comme des caracteres, si data2 est \0, c'est pas trop etonnant que tu ne le
> voie pas mais tu devrais etre capable de le verifier (piper dans od, sortir
> vers un fichier et regarder avec un editeur hexa,...)


Et en plus, le resultat doit etre indefini, vu que data1 et data2 sont
utilisés avant leur initialisation. On en a parlé ici il n'y a pas si
longtemps

>
> Essaie
> cout << "0x" << hex << setw(4) << setfill('0') << unsigned(data1) << "=";
> cout << "0x" << hex << setw(2) << setfill('0') << unsigned(data2) << endl;


Ca donne bien le resultat attendu (avec des variables correctement
initialisees). A la premiere lecture, j'ai trouve etrange l'usage
explicite du prefixe "0x", parce qu'on peut l'obtenir avec le
manipulateur showbase (il faut aussi internal pour le remplissage).
On devrait donc obtenir le resultat comme ceci :

uint8_t data1 = 0xaa , data2 = 0x0 ;
cout << setw(6) << setfill('0')
<< hex << showbase << internal << unsigned(data1) << "=";
cout << setw(4) << setfill('0')
<< hex << showbase << unsigned(data2) << endl ;

Et la j'obtient:

0x00aa=0000

A ma grande surprise, showbase n'ajoute pas le prefixe de base pour
a valeur 0 ( il faut dire que ca ne sert a rien vu que 0 est commun
a toutes les bases ). Jusqu'a present je pensais que le prefixe etait
ajouté systematiquement, parce que je n'etait jamais tombé sur le
cas particulier de 0, ni vu dans aucune doc qu'il y avait un
comportement special.

Avec printf, le comportement est identique :

printf( "%#06x=%#04x", unsigned(data1), unsigned(data2) ) ;

0x00aa=0000

La, c'est quand meme plus clair, parce que le man printf(3) me
dit que pour le caractere #, on a

"For x and X conversions, a non-zero result has the string
0x (or 0X for X conversions) prepended to it."

Les deux langages on le meme comportement, au fond, c'est pratique,
mais est-ce que c'est standard ?












  Réponse avec citation
Vieux 07/03/2008, 14h26   #4
Gabriel Dos Reis
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

Michel Decima <michel.decima@orange-ft.com> writes:

| Jean-Marc Bourguet a écrit :
| > Guillaume GOURDIN <trash@hotmail.com> writes:
| >
| >> Bonjour à tous,
| >>
| >> j'ai un problème, le code suivat :
| >>
| >> uint8_t data1, data2;
| >> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "=";
| >> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl;
| >>
| >> me sort l'output suivant :
| >>
| >> 0x00aa=0x0
| >>
| >> alors que je m'attendrais (et que je voudrais) quelque chose du genre:
| >>
| >> 0x00aa=0x00
| >>
| >> Vous avez des idées?
| > Ce qui me surprend, c'est la partie aa. uint8_t est
| > vraissemblablement un
| > typedef sur unsigned char et donc data1 et data2 devraient etre affiche
| > comme des caracteres, si data2 est \0, c'est pas trop etonnant que tu ne le
| > voie pas mais tu devrais etre capable de le verifier (piper dans od, sortir
| > vers un fichier et regarder avec un editeur hexa,...)
|
| Et en plus, le resultat doit etre indefini, vu que data1 et data2 sont
| utilisés avant leur initialisation. On en a parlé ici il n'y a pas si
| longtemps

sauf si uint8_t est un unsigned char :-)

-- Gaby
  Réponse avec citation
Vieux 07/03/2008, 20h21   #5
Michel Decima
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

Gabriel Dos Reis a écrit :
> Michel Decima <michel.decima@orange-ft.com> writes:
>
> | > Guillaume GOURDIN <trash@hotmail.com> writes:
> | >
> | >> Bonjour à tous,
> | >>
> | >> j'ai un problème, le code suivat :
> | >>
> | >> uint8_t data1, data2;
> | >> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "=";
> | >> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl;


> | Et en plus, le resultat doit etre indefini, vu que data1 et data2 sont
> | utilisés avant leur initialisation. On en a parlé ici il n'y a pas si
> | longtemps
>
> sauf si uint8_t est un unsigned char :-)


Mmmh. parce que unsigned char ne peut pas avoir de 'trap value' ?



  Réponse avec citation
Vieux 07/03/2008, 20h27   #6
Sylvain
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

Michel Decima wrote on 07/03/2008 21:21:
> Gabriel Dos Reis a écrit :
>>
>> sauf si uint8_t est un unsigned char :-)

>
> Mmmh. parce que unsigned char ne peut pas avoir de 'trap value' ?


voire parce qu'un type utilisateur influencerait le contenu mémoire ?

Sylvain.


  Réponse avec citation
Vieux 07/03/2008, 21h01   #7
James Kanze
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

On 7 mar, 21:27, Sylvain <noS...@mail.net> wrote:
> Michel Decima wrote on 07/03/2008 21:21:


> > Gabriel Dos Reis a écrit :


> >> sauf si uint8_t est un unsigned char :-)


> > Mmmh. parce que unsigned char ne peut pas avoir de 'trap value' ?


> voire parce qu'un type utilisateur influencerait le contenu mémoire ?


Le type influence bien comment on y accède.

--
James Kanze (GABI Software) email:james.kanze@gmail.com
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
  Réponse avec citation
Vieux 07/03/2008, 21h04   #8
James Kanze
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

On 7 mar, 14:47, Michel Decima <michel.dec...@orange-ft.com> wrote:
> Jean-Marc Bourguet a écrit :
> > Essaie
> > cout << "0x" << hex << setw(4) << setfill('0') << unsigned(data1) << "=";
> > cout << "0x" << hex << setw(2) << setfill('0') << unsigned(data2) << endl;


> Ca donne bien le resultat attendu (avec des variables
> correctement initialisees). A la premiere lecture, j'ai trouve
> etrange l'usage explicite du prefixe "0x", parce qu'on peut
> l'obtenir avec le manipulateur showbase (il faut aussi
> internal pour le remplissage). On devrait donc obtenir le
> resultat comme ceci :


> uint8_t data1 = 0xaa , data2 = 0x0 ;
> cout << setw(6) << setfill('0')
> << hex << showbase << internal << unsigned(data1) << "=";
> cout << setw(4) << setfill('0')
> << hex << showbase << unsigned(data2) << endl ;


> Et la j'obtient:


> 0x00aa=0000


> A ma grande surprise, showbase n'ajoute pas le prefixe de base pour
> a valeur 0 ( il faut dire que ca ne sert a rien vu que 0 est commun
> a toutes les bases ). Jusqu'a present je pensais que le prefixe etait
> ajouté systematiquement, parce que je n'etait jamais tombé sur le
> cas particulier de 0, ni vu dans aucune doc qu'il y avait un
> comportement special.


> Avec printf, le comportement est identique :


> printf( "%#06x=%#04x", unsigned(data1), unsigned(data2) ) ;


> 0x00aa=0000


> La, c'est quand meme plus clair, parce que le man printf(3) me
> dit que pour le caractere #, on a


> "For x and X conversions, a non-zero result has the string
> 0x (or 0X for X conversions) prepended to it."


> Les deux langages on le meme comportement, au fond, c'est pratique,
> mais est-ce que c'est standard ?


Oui:-(. J'ai rencontré le même problème, il y a peu. Je l'ai
résolu en sortant le "0x" explicitement. (À vrai dire, ça
m'arrangeait, parce que je voulais l'x dans "0x" minuscule, mais
les chiffres hex majuscule.)

--
James Kanze (GABI Software) email:james.kanze@gmail.com
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

  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 20h59.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,15322 seconds with 16 queries