Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Formater une sortie std::cout

9 réponses
Avatar
Leo
Bobjour,

Lorsque je tente d'afficher un int, cet int est en hexad=E9cimal, or il
faut qu'il soit en decimal.

Merci de votre aide.

9 réponses

Avatar
espie
In article ,
Leo wrote:
Bobjour,

Lorsque je tente d'afficher un int, cet int est en hexadécimal, or il
faut qu'il soit en decimal.

Merci de votre aide.


Donne un extrait de code, on en reparle ensuite...

Avatar
Leo
On 19 fév, 21:37, (Marc Espie) wrote:
In article ,

Leo wrote:
Bobjour,

Lorsque je tente d'afficher un int, cet int est en hexadécimal, or il
faut qu'il soit en decimal.

Merci de votre aide.


Donne un extrait de code, on en reparle ensuite...


Voila :

boost::mt19937 rng( time(NULL) );
// loi uniforme entre 10000 et 99999
boost::uniform_int<> dist(10001, 99998 );
// objet fonctionnel associant le generateur et la loi
boost::variate_generator<boost::mt19937&, boost::uniform_int<> >
die(rng, dist);

int al = die() % 99999;

// créer un flux de sortie
std::ostringstream oss;
// écrire un nombre dans le flux
oss << al;
// récupérer une chaîne de caractères
std::string result = oss.str();

return result;


//et la il me sort un nombre hexadecimal


Avatar
Michel Decima
On 19 fév, 21:37, (Marc Espie) wrote:
In article ,

Leo wrote:
Bobjour,
Lorsque je tente d'afficher un int, cet int est en hexadécimal, or il
faut qu'il soit en decimal.
Merci de votre aide.
Donne un extrait de code, on en reparle ensuite...



Voila :

boost::mt19937 rng( time(NULL) );
// loi uniforme entre 10000 et 99999
boost::uniform_int<> dist(10001, 99998 );


Je dirais plutot entre 10001 et 99998, mais c'est une question de gout.

// objet fonctionnel associant le generateur et la loi
boost::variate_generator<boost::mt19937&, boost::uniform_int<> >
die(rng, dist);

int al = die() % 99999;


Le modulo est inutile.


// créer un flux de sortie
std::ostringstream oss;
// écrire un nombre dans le flux
oss << al;
// récupérer une chaîne de caractères
std::string result = oss.str();
return result;

//et la il me sort un nombre hexadecimal


Tu veux dire que la chaine de caractere contient un nombre hexa ?
Comment fais tu l'affichage de cette chaine ?

J'ai rajouté les includes necessaires, remplacé le return par un
std::cout, et j'obtiens des nombres en decimal, comme on s'y attendait.
Tu es sur qu'il n'y a pas autre chose ?



Avatar
Leo
On 20 fév, 08:58, Michel Decima wrote:

On 19 fév, 21:37, (Marc Espie) wrote:
In article ,

Leo wrote:
Bobjour,
Lorsque je tente d'afficher un int, cet int est en hexadécimal, or il
faut qu'il soit en decimal.
Merci de votre aide.
Donne un extrait de code, on en reparle ensuite...



Voila :

boost::mt19937 rng( time(NULL) );
// loi uniforme entre 10000 et 99999
boost::uniform_int<> dist(10001, 99998 );


Je dirais plutot entre 10001 et 99998, mais c'est une question de gout.

J'ai oublie de changer le commentaire.


// objet fonctionnel associant le generateur et la loi
boost::variate_generator<boost::mt19937&, boost::uniform_int<> >
die(rng, dist);

int al = die() % 99999;


Le modulo est inutile.


Je sais mais c'etait pour etre sur que le probleme ne vient pas de
la.




// créer un flux de sortie
std::ostringstream oss;
// écrire un nombre dans le flux
oss << al;
// récupérer une chaîne de caractères
std::string result = oss.str();
return result;

//et la il me sort un nombre hexadecimal


Tu veux dire que la chaine de caractere contient un nombre hexa ?
Comment fais tu l'affichage de cette chaine ?

J'ai rajouté les includes necessaires, remplacé le return par un
std::cout, et j'obtiens des nombres en decimal, comme on s'y attendait.
Tu es sur qu'il n'y a pas autre chose ?



La fonction s'appelle Generer, j'ai fait ca :
std::cout<<Generer();

et ca me sort un truc genre 00411DF


Mais le truc bizard c'est que quand j'utilise le nombre retourne, cela
marche tres bien.(de plus pendant l'execution, avec le debogeur, cela
gennere un nombre decimal)

Donc tout va bien. :o)




Avatar
Michel Decima
On 20 fév, 08:58, Michel Decima wrote:

La fonction s'appelle Generer, j'ai fait ca :
std::cout<<Generer();

et ca me sort un truc genre 00411DF


Quel est le prototype de la fonction Generer() ? Est-ce que tu peux
poster un exemple restreint mais complet (includes + fonction + main)
qui reproduit le probleme chez toi ?

Avatar
Serge Paccalin
Le 20.02.2007 13:12, Leo a ecrit:

La fonction s'appelle Generer, j'ai fait ca :
std::cout<<Generer();

et ca me sort un truc genre 00411DF


On dirait une adresse. Tu n'as pas oublié les parenthèses de l'appel à
Generer ? Un truc comme ça :

std::cout << Generer;

ce qui te ferait afficher l'adresse de la fonction...

La fonction Generer ne retourne pas un pointeur ?

bizard


« Bizarre ».

--
Serge Paccalin


Avatar
Leo
On 20 fév, 13:55, Serge Paccalin wrote:
Le 20.02.2007 13:12, Leo a ecrit:

La fonction s'appelle Generer, j'ai fait ca :
std::cout<<Generer();

et ca me sort un truc genre 00411DF


On dirait une adresse. Tu n'as pas oublié les parenthèses de l'appel à
Generer ? Un truc comme ça :

std::cout << Generer;

ce qui te ferait afficher l'adresse de la fonction...

La fonction Generer ne retourne pas un pointeur ?

bizard


« Bizarre ».

--
Serge Paccalin



Oui, en effet, j'ai oublie les paranthese. :o)


Avatar
James Kanze
Leo wrote:
On 20 fév, 08:58, Michel Decima wrote:

La fonction s'appelle Generer, j'ai fait ca :
std::cout<<Generer();

et ca me sort un truc genre 00411DF

Mais le truc bizard c'est que quand j'utilise le nombre retourne, cela
marche tres bien.(de plus pendant l'execution, avec le debogeur, cela
gennere un nombre decimal)


Un nombre, ce n'est jamais décimal ni hexadécimal. Un nombre,
c'est une valeur numérique, c'est tout ; il n'a pas de format.
(Ou plutôt, il a un format interne qui n'est pas du texte, et
qui est binaire -- complément à deux sur la plupart des
machines.)

Le formattage en texte, c'est l'opérateur << qui l'effectue, en
fonction des options de formattage présentes dans le flux. Et
attention : à l'exception de la largeur, ces options
persistent. Si jamais tu as démandé une sortie en format
héxadécimal, tous les sorties (numériques) sur ce flux seront en
héxadécimal jusqu'à nouvel ordre. En général donc, il est
considéré bon ton de restaurer tout ce que tu changes, soit au
moyen d'une classe RAII (genre IOSave chez moi), soit au moyen
des manipulateurs qui restituent à la fin de l'expression
complète (comme ceux qui dérivent de SSManip chez moi).

Sinon, on peut s'isoler de l'état du flux en formattant vers un
ostringstream (qu'on vient de créer, et qui donc a toutes les
options de formattage à l'état par défaut), et ensuite insérant
la chaîne générée dans le flux ciblé.

--
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
James Kanze
Serge Paccalin wrote:
Le 20.02.2007 13:12, Leo a ecrit:

La fonction s'appelle Generer, j'ai fait ca :
std::cout<<Generer();

et ca me sort un truc genre 00411DF


On dirait une adresse. Tu n'as pas oublié les parenthèses de l'appel à
Generer ? Un truc comme ça :

std::cout << Generer;

ce qui te ferait afficher l'adresse de la fonction...


Ça ne doit pas le faire. Si Generer est une fonction, il n'y a
pas de << (standard, en tout cas) qui peut sortir son adresse.
On ne peut sortir que les adresses des données.

En fait, il y a bien une conversion implicite de « pointeur à
fonction » en bool, et un opérateur << pour bool. Un
compilateur est donc obligé à accepter la ligne en question ;
puisque l'adresse de Generer n'est pas null, le resultat de la
conversion est toujours vrai, et on doit afficher "1".

C'est ce que fait g++ et Sun CC. G++ émet un avertissement,
aussi, signalant que le resultat de la conversion est toujours
vrai -- c'est une bonne idée, parce que la plupart du temps,
quand on convertit un nom d'une fonction en bool, c'est suite à
une erreur de programmation.

--
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