boost :: posix_time завершается неудачно в сборке релиза - PullRequest
3 голосов
/ 09 марта 2011

Я хочу открывать новый файл журнала при каждом запуске программы, поэтому я создаю имя файла с текущим временем.

FILE * fplog;

void OpenLog()
{
    boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
    char buf[256];
    sprintf(buf,"ecrew%d%02d%02d_%02d%02d%02d.log",
        now.date().year(),now.date().month(),now.date().day(),
        now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 
    fplog = fopen(buf,"w");

}

Это отлично работает в отладочной сборке, создавая файлы с такими именами, как

ecrew20110309_141506.log

Однако тот же код странным образом завершается с ошибкой в ​​сборке выпуска

ecrew198619589827196617_141338.log

Кстати, это также не работает аналогичным образом:

boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
char buf[256];

boost::gregorian::date day (boost::gregorian::day_clock::local_day());

sprintf(buf,"ecrew%d%02d%02d_%02d%02d%02d.log",
    day.year(),day.month(),day.day(),
now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 

fplog = fopen(buf,"w");

Это работает:

boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
char buf[256];
sprintf(buf,"ecrew%s_%02d%02d%02d.log",
    to_iso_string( boost::gregorian::day_clock::local_day() ).c_str(),
    now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 
fplog = fopen(buf,"w");

Мне все еще было бы любопытно, почему предыдущие две версии терпят неудачу в сборке релиза, но работают в отладке.

1 Ответ

4 голосов
/ 16 июня 2011

Хорошо, я немного опоздал, но когда я наткнулся на ваш вопрос, когда сам искал ответ (day_clock :: local_day () дает странные результаты при компиляции как Release, здесь, на Win XP + Boost 1.46), Я думал, что должен вернуться с тем, что сработало для меня.

Кажется, что данные хранятся (я просто использую год, месяц и день) в 16-битной манере, но когда вы читаете их, вы получаете 32-битное целое число, и при любой ошибке, она записывает мусор в верхние биты или не очищает их перед записью в младшие байты.

Итак, мой обходной путь - просто обнулить 16 верхних битов:

date todaysdate(day_clock::local_day());
int year = todaysdate.year() & 0xFFFF;

вместо сказать:

date todaysdate(day_clock::local_day());
int year = todaysdate.year();

и у меня все равно хорошо работает.

Valmond

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...