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

Problème avec les facets - Pour les heures

2 réponses
Avatar
p-fifty-fifty
Bonjour,

(ps: ce post est une quasi-copie de
http://www.siteduzero.com/forum-83-269167-p1-probleme-avec-les-facets.html
, faute de reponse)

J'ai un probl=E8me avec mes facets, je mets le code et j'explique apres:

Mon main.cpp, qui affiche chaque seconde l'heure courante:
<<<
#include <iostream>
#include <locale>
#include <Tools/Hour.hpp>
#include <Tools/Sleep.hpp>

int main(void)
{
std::cout << "Sample : Hour\n"
"Ctrl+C for quit\n" << std::endl;

ts::HourOFacet *Facet(new ts::HourOFacet("%H %M %S"));
std::cout.imbue(std::locale(std::cout.getloc(), Facet));

ts::SecIterator It =3D ts::Hour::Local();
for(size_t i =3D 0; std::cout << *It++ << std::endl; ++i)
{
ts::Sleep(1000);

if(i > 59)
{
*It =3D ts::Hour::Local();
i =3D 0;
}
}

return 0;
}
>>>

Facet.hpp
<<<
#ifndef TOOLS_HOUR_FACET_HPP_INCLUDED
#define TOOLS_HOUR_FACET_HPP_INCLUDED

#include <string>
#include <locale>
#include <ctime>

namespace ts
{
template<typename CharT> class BasicHourOFacet
: public std::time_put<CharT>
{
private:

/* Typedef */
typedef CharT char_type;
typedef std::basic_string<char_type> string_type;
typedef struct tm tm_type;

public:

/* Constructor */
BasicHourOFacet(const char_type *Format, size_t R =3D 0);

/* Destructor */
~BasicHourOFacet(void);

/* To string */
string_type ToString(const tm_type &Me) const;

/* ID */
static std::locale::id id;

private:

/* Data member */
const char_type *myFormat;
};
}

#include <Tools/Hour/Facet.inl>

#endif // TOOLS_HOUR_FACET_HPP_INCLUDED
>>>

Facet.inl
<<<
#include <sstream>

namespace ts
{
template<typename CharT>
std::locale::id BasicHourOFacet<CharT>::id;

template<typename CharT>
BasicHourOFacet<CharT>::BasicHourOFacet(const char_type *Format,
size_t R) :
std::time_put<char_type>(R),
myFormat (Format)
{}

template<typename CharT>
BasicHourOFacet<CharT>::~BasicHourOFacet(void)
{}

template<typename CharT>
std::basic_string<CharT> BasicHourOFacet<CharT>::ToString(const
tm_type &Me) const
{
std::basic_ostringstream<char_type> Oss;

put(Oss, Oss, Oss.fill(), &Me, myFormat, myFormat +
sizeof(myFormat));

return Oss.str();
}
}
>>>

Bon mon probleme vient de (main.cpp):
<<<
ts::HourOFacet *Facet(new ts::HourOFacet("%H %M %S"));
>>>

Plus precisement ca vient du "%H %M %S", seul les quatres premiers
caracteres sont "pris" (c=E0d "%H %"), et je ne comprends pas pourquoi
(ca doit venir de ts::BasicHourOFacet::ToString())

Je rajouterais egalement que le code suivant marche:
<<<
#include <iostream>
#include <sstream>
#include <locale>
#include <ctime>

int main(void)
{
time_t TimeT =3D std::time(0);
const struct tm *Time =3D std::localtime(&TimeT);

const char Format[] =3D "%H %M %S";
const std::time_put<char> &TimePut =3D
std::use_facet<std::time_put<char> >(std::cout.getloc());

std::ostringstream Oss;
TimePut.put(Oss, Oss, Oss.fill(), Time, Format, Format +
sizeof(Format));

std::cout << Oss.str() << std::endl;

return 0;
}
>>>

Ce code est bas=E9 sur le meme principe que ma facet, pourtant avec ma
facet ca ne marche pas.

Voila, si je n'ai pas =E9t=E9 assez clair, dites-le moi.
Merci

2 réponses

Avatar
Eric.Malenfant
On Apr 30, 4:29 pm, wrote:
[snip]
template<typename CharT> class BasicHourOFacet
: public std::time_put<CharT>
{
[snip]

/* Data member */
const char_type *myFormat;

};
[snip]


template<typename CharT>
BasicHourOFacet<CharT>::BasicHourOFacet(const char_type *Format,
size_t R) :
std::time_put<char_type>(R),
myFormat (Format)
{}


Ceci est fragile: En ne compiant que le pointeur, il faut que le
Format passé par le créateur de la Facet reste alloué tant que la
Facet existe.

template<typename CharT>
std::basic_string<CharT> BasicHourOFacet<CharT>::ToString(const
tm_type &Me) const
{
std::basic_ostringstream<char_type> Oss;

put(Oss, Oss, Oss.fill(), &Me, myFormat, myFormat +
sizeof(myFormat));


sizeof(myFormat) == sizeof (char*) != strlen(myFormat).

Plus precisement ca vient du "%H %M %S", seul les quatres premiers
caracteres sont "pris" (càd "%H %"), et je ne comprends pas pourquoi


Si, sur ta plateforme, tu as des pointeurs de 4 bytes,
sizeof(myFormat) == 4. Le dernier paramètre passé a put() dans
ToString() pointe donc au 4e caractère de "%H %M %S" et put() ne
"voit" donc que "%H %"

Avatar
p-fifty-fifty
On 30 avr, 23:36, ""
wrote:
On Apr 30, 4:29 pm, wrote:
[snip]



template<typename CharT> class BasicHourOFacet
: public std::time_put<CharT>
{
[snip]

/* Data member */
const char_type *myFormat;

};
[snip]


template<typename CharT>
BasicHourOFacet<CharT>::BasicHourOFacet(const char_type *Format,
size_t R) :
std::time_put<char_type>(R),
myFormat (Format)
{}


Ceci est fragile: En ne compiant que le pointeur, il faut que le
Format passé par le créateur de la Facet reste alloué tant que la
Facet existe.

template<typename CharT>
std::basic_string<CharT> BasicHourOFacet<CharT>::ToString(const
tm_type &Me) const
{
std::basic_ostringstream<char_type> Oss;

put(Oss, Oss, Oss.fill(), &Me, myFormat, myFormat +
sizeof(myFormat));


sizeof(myFormat) == sizeof (char*) != strlen(myFormat).

Plus precisement ca vient du "%H %M %S", seul les quatres premiers
caracteres sont "pris" (càd "%H %"), et je ne comprends pas pourquoi


Si, sur ta plateforme, tu as des pointeurs de 4 bytes,
sizeof(myFormat) == 4. Le dernier paramètre passé a put() dans
ToString() pointe donc au 4e caractère de "%H %M %S" et put() ne
"voit" donc que "%H %"


en effet c'etais ca, erreur stupide de ma part, merci