e8tools / tool1cd

Инструмент для работы с файлами 1CD за авторством Валерия Агеева с адаптацией от сообщества
GNU General Public License v3.0
115 stars 29 forks source link

Заменить магические числа на константы #22

Closed ava57r closed 6 years ago

ava57r commented 7 years ago

Заменить магические числа на константы. В идеале в коде должны остаться 0, 1, -1

fishca commented 7 years ago

Ты про какие числа ведешь речь?

ava57r commented 7 years ago

Вот тут 60 и 1000 - это магические числа

void memblock::garbage()
{
    uint32_t curt = GetTickCount();
    while(first)
    {
        if(curt - first->lastdataget > live_cash * 60 * 1000) delete first;
        else break;
    }
}
ava57r commented 7 years ago

@dmpas Как назвать это скопление чисел?

APIcfBase.cpp
//преобразование времени
void V8timeToFileTime(const int64_t* v8t, FILETIME* ft){
504911232000000 = ((365 * 4 + 1) * 100 - 3) * 4 * 24 * 60 * 60 * 10000
awa15 commented 7 years ago

Как назвать, думайте сами, смысл тут такой: FILETIME начинается с даты 01.01.0401, а время 1С начинается с даты 01.01.0001. Тут расписан расчет дельты в 400 лет с учетом високосных для перевода времени из формата 1С в формат FILETIME.

ava57r commented 7 years ago

@awa15 400 лет выраженных в секундах?

awa15 commented 7 years ago

Нет. В секундах - это без последнего коэффициента 10000. 1Сное время - это количество стомикросекундных интервалов, начиная с 01.01.0001 0:00:00. А FILETIME - это количество стонаносекундных интервалов, начиная с 01.01.0401 0:00:00. Т.е. при переводе времени туда-сюда, кроме смещения в 400 лет, надо ещё на 1000 делить/умножать.

ava57r commented 7 years ago

Да, тут трудно дать название. Мучают меня сомнения по этой цифре

50491123200 = ((365 * 4 + 1) * 100 - 3) * 4 * 24 * 60 * 60

получается не 400 лет, а 400 * 4 = 1600 (лет)

4 столетия = 12622780800 секунд

awa15 commented 7 years ago

А, ну да. Это с моей памятью что-то не то)) FILETIME начинается с 01.01.1601, конечно же!

awa15 commented 7 years ago

А, ну да. Это с моей памятью что-то не то)) FILETIME начинается с 01.01.1601, конечно же!

awa15 commented 7 years ago

Фактически, это магическое число - дата 01.01.1601 0:00:00 в формате 1С.

ava57r commented 7 years ago

Будет константой DATETIME_1600_YEARS_FORMAT_1C

0x7fffffff - предел знакового положительного 32х битного целого?

awa15 commented 7 years ago

Да, это INT_MAX, оно же LONG_MAX в 32 битных компиляторах. Не знаю, есть ли какая стандартная константа, не зависящая от разрядности компилятора. Что-нибудь типа _I32_MAX. Если вдруг интересно, есть вот такая статья от злейшего бобра http://infostart.ru/public/250142/

ava57r commented 7 years ago

в есть define MAX_INT Я сделал через std::numeric_limits<int>::max()

dmpas commented 7 years ago

Int32_max должен быть макрос

fishca commented 7 years ago

1 января этого года (1601-01-01) является началом отсчёта для некоторых форматов хранения даты и времени в Microsoft Windows — для свойств файлов (структура FILETIME) - т.е. это специфическая дата именно для Windows. Лучше приводить к UTC, если мы хотим кроссплатформенности?

fishca commented 7 years ago

В Linux, если я правильно понял дата файла будет отсчитываться от 1 января 1970 года. Соответственно надо корректировать в зависимости от местонахождения кода.

ava57r commented 7 years ago

Я так понял дата в файле 1CD в своем формате хранится, а вот когда мы будем писать время файла, то надо в зависимости от операционки.

fishca commented 7 years ago

Есть в коде чтение даты/времени файла 1CD, там идет четкая привязка к полям. Т.е. на винде это будут одни поля со значениями, в случае создания файла 1CD в Линухе это уже совсем другая структура получится. Тут надо либо экспериментировать и смотреть как 1С это реализовала на разных осях, либо отказываться от кроссплатформенности. Хотя при создании в среде Линух-а 1С могла и сохранить формат даты как в винде.

dmpas commented 7 years ago

дата в 1С - одна дата структура даты в линухе - вторая дата структура даты в винде - третья дата

кроссплатформенность никуда не девается, ifdef-ы нас спасут.

ava57r commented 6 years ago

основная магии подчищена