|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
(ps: ce post est une quasi-copie de http://www.siteduzero.com/forum-83-2...es-facets.html , faute de reponse) J'ai un problème 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 = ts::Hour::Local(); for(size_t i = 0; std::cout << *It++ << std::endl; ++i) { ts::Sleep(1000); if(i > 59) { *It = ts::Hour::Local(); i = 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 = 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àd "%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 = std::time(0); const struct tm *Time = std::localtime(&TimeT); const char Format[] = "%H %M %S"; const std::time_put<char> &TimePut = std::use_facet<std::time_put<char> >(std::cout.getloc()); std: stringstream Oss;TimePut.put(Oss, Oss, Oss.fill(), Time, Format, Format + sizeof(Format)); std::cout << Oss.str() << std::endl; return 0; } >>> Ce code est basé sur le meme principe que ma facet, pourtant avec ma facet ca ne marche pas. Voila, si je n'ai pas été assez clair, dites-le moi. Merci |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
On Apr 30, 4:29 pm, p-fifty-fi...@hotmail.com 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 %" |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On 30 avr, 23:36, "Eric.Malenf...@gmail.com"
<Eric.Malenf...@gmail.com> wrote: > On Apr 30, 4:29 pm, p-fifty-fi...@hotmail.com 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 |
|
![]() |
| Outils de la discussion | |
|
|