Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Получить результат выполнения  [new]
DoctorRoot
Member

Откуда:
Сообщений: 25
Доброго времени суток! Скинули готовый фрагмент кода на С++ в котором из числа получают дату.
Например вводим число: 131596568 получаем дату: 24.01.2008.

Подскажите как мне из процедуры void TDateLP::longToDate(long val) сделать функцию, чтобы можно было получать результат её выполнения?

#include <iostream>
#include <string>

using namespace std;

class TDateLP
{
    public:
        unsigned char day;
        unsigned char month;
        unsigned short year;

        void longToDate(long val);
};

void TDateLP::longToDate(long val)
{
    *(long*)&day = val;

    printf("%02d/%02d/%02d\n", day, month, year);
}

int main() {

    TDateLP date1;
    long long_date = 131596568; // 24.01.2008

    date1.longToDate(long_date);

    return 0;
}
13 сен 21, 19:15    [22371389]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3731
DoctorRoot, написать return вместо printf, но лучше изучить Си.
13 сен 21, 20:18    [22371419]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6580
DoctorRoot,

Код не сильно корректный.

В зависимости от настроек компилятора выравнивания, можно получить мусор.

Лучше уж union использовать для подобного
14 сен 21, 00:05    [22371503]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
DoctorRoot
Member

Откуда:
Сообщений: 25
rdb_dev, спасибо за ответ. Дело в том, что я занимаюсь переходом из одной системы в другую. Значения хранятся в БД MS SQL, а алгоритм мне скинули программы из которой я осуществляю переход. Знать Си - это хорошо, вот только за последние 10 лет он встретился впервые :)

Сообщение было отредактировано: 14 сен 21, 09:02
14 сен 21, 09:11    [22371561]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dima T
Member

Откуда:
Сообщений: 15930
Формулы приведения такие:
День = 131596568 % 256
Месяц = Целое(131596568/256) % 256
Год = Целое(131596568/65536)

% - остаток от деления
Целое() - округление до целого вниз

Сообщение было отредактировано: 14 сен 21, 09:15
14 сен 21, 09:20    [22371569]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54068

DoctorRoot
Знать Си - это хорошо, вот только за последние 10 лет он встретился впервые :)

А в дельфийском разделе тебе впервые встретился Дельфи. Почему вообще тебе
поручили эту работу?..

Posted via ActualForum NNTP Server 1.5

14 сен 21, 12:31    [22371682]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
mayton
Member

Откуда: loopback
Сообщений: 52342
Учитывая весь ужас происходящего я сильно рекомендую автору не трогать язык Си а
формулу перевода времени просто реализовать в Delphi.
14 сен 21, 16:01    [22371776]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dima T
Member

Откуда:
Сообщений: 15930
mayton
Учитывая весь ужас происходящего я сильно рекомендую автору не трогать язык Си а
формулу перевода времени просто реализовать в Delphi.

Там изначально int-порно какое-то, лучше в тип date преобразовать один раз и забыть про это безобразие. Можно виртуальный столбец сделать, где будут полноценные даты. Средств MSSQL достаточно для конвертации.
14 сен 21, 19:13    [22371883]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
mayton
Member

Откуда: loopback
Сообщений: 52342
Зачем эти игры с целочисленным делением? В любом языке есть стандартное API
для работы с календарными расчетами. И надо иметь ооочень много оснований
чтобы делать что-то своё велосипедное в этом направлении.
14 сен 21, 20:20    [22371900]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dima T
Member

Откуда:
Сообщений: 15930
mayton
Зачем эти игры с целочисленным делением? В любом языке есть стандартное API
для работы с календарными расчетами. И надо иметь ооочень много оснований
чтобы делать что-то своё велосипедное в этом направлении.

Потому что кто-то изобрел велосипед где, с учетом обратной записи при хранении, младший байт - это день, следующий - это месяц, а два оставшихся вместе - год.
14 сен 21, 21:11    [22371911]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54068

BCD это, вообще-то довольно старый формат. Местами весьма удобный. Быстро
преобразуется, правильно сортируется.
https://www.digital-detective.net/binary-coded-decimal-timestamps/

Posted via ActualForum NNTP Server 1.5

14 сен 21, 22:18    [22371931]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6580
Dimitry Sibiryakov,

это не BCD, это изобретение нуба не знающего даже про time_t
14 сен 21, 22:22    [22371936]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3731
Dimitry Sibiryakov, формат внутреннего представления борландовского TDateTime тоже не очень сложен - double.
14 сен 21, 22:26    [22371938]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
White Owl
Member

Откуда:
Сообщений: 12850
Siemargl
Dimitry Sibiryakov,

это не BCD, это изобретение нуба не знающего даже про time_t
time_t не так уж удобен. Далеко не все языки умеют с ним работать и вручную его перевести в печатный формат не очень просто. Так что различные форматы дат очень даже востребованы.
Пока ты живешь в С/С++ мире - time_t действительно очень удобен. Переезжаешь в те-же базы данных и опаньки. Начинаешь считать что-нибудь и более-менее реальной астрономии и упираешься в начало эпохи.
В общем, нубы может и изобретают свои форматы, но вот гуру вспоминая свои нубские года удивляются собственной прозорливости.
14 сен 21, 22:30    [22371939]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54068

Но его не разложить на составляющие простыми битовыми операциями, формула там
довольно зубодробительная. Этот же формат явно для какого-то слабого железа был
сделан. Возможно даже без операции деления вообще.

Posted via ActualForum NNTP Server 1.5

14 сен 21, 22:32    [22371940]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
White Owl
Member

Откуда:
Сообщений: 12850
mayton
Зачем эти игры с целочисленным делением? В любом языке есть стандартное API
для работы с календарными расчетами. И надо иметь ооочень много оснований
чтобы делать что-то своё велосипедное в этом направлении.
Для соединения одного стандартного API с другим стандартным API.
14 сен 21, 22:32    [22371941]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3731
White Owl, time_since_epoch, это ещё куда не шло... В борландовском TDateTime упираешься в 1899-12-30T00:00 :)
14 сен 21, 22:35    [22371944]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3731
Dimitry Sibiryakov

Но его не разложить на составляющие простыми битовыми операциями, формула там
довольно зубодробительная. Этот же формат явно для какого-то слабого железа был
сделан. Возможно даже без операции деления вообще.
Ты про double?
14 сен 21, 22:48    [22371953]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54068

rdb_dev
Ты про double?

Я про любой формат "XXX since epoch", включая, естественно, дельфийский
TDateTime и линуховый time_t.

Posted via ActualForum NNTP Server 1.5

15 сен 21, 00:32    [22371971]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 708
DoctorRoot
class TDateLP
{
    public:
        unsigned char day;
        unsigned char month;
        unsigned short year;

        void longToDate(long val);
};

void TDateLP::longToDate(long val)
{
    *(long*)&day = val;
Плохой код, потому что sizeof(TDateLP) = 4, а long на некоторых платформах 64-битный (то есть 8 байт). Лучше распаковывать дату с помощью битовых операций:
#include <assert.h>

struct TDateLP { // не нужен здесь class, совсем
  unsigned char day;
  unsigned char month;
  unsigned short year;
};

TDateLP unpack_date(long packed_date) {
  TDateLP result;
  result.day = packed_date & 0xff;
  result.month = (packed_date >> 8) & 0xff;
  result.year = packed_date >> 16;
  return result;
}

int main() {
  TDateLP d = unpack_date(131596568);
  assert((d.day == 24) && (d.month == 1) && (d.year == 2008));
  return 0;
}
15 сен 21, 00:43    [22371972]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
DoctorRoot
Member

Откуда:
Сообщений: 25
Dimitry Sibiryakov, спасибо за ответ. В дельфийском разделе мне ответили и я успешно применил этот код. То как это работает мне не было понятно, теперь я знаю. А что с этим какие-то есть проблемы?
24 сен 21, 09:41    [22375246]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
DoctorRoot
Member

Откуда:
Сообщений: 25
Dima T, спасибо большое! Язык С и не собирался трогать, это он ко мне полез )

Сообщение было отредактировано: 24 сен 21, 09:38
24 сен 21, 09:46    [22375249]     Ответить | Цитировать Сообщить модератору
 Re: Получить результат выполнения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54068

DoctorRoot
спасибо за ответ.

Вообще-то это был вопрос...

Posted via ActualForum NNTP Server 1.5

24 сен 21, 11:53    [22375275]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить