Гость
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Получить результат выполнения / 23 сообщений из 23, страница 1 из 1
13.09.2021, 19:15
    #40097345
DoctorRoot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Доброго времени суток! Скинули готовый фрагмент кода на С++ в котором из числа получают дату.
Например вводим число: 131596568 получаем дату: 24.01.2008.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
#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;
}
...
Рейтинг: 0 / 0
13.09.2021, 20:18
    #40097362
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
DoctorRoot, написать return вместо printf, но лучше изучить Си.
...
Рейтинг: 0 / 0
14.09.2021, 00:05
    #40097409
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
DoctorRoot,

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

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

Лучше уж union использовать для подобного
...
Рейтинг: 0 / 0
14.09.2021, 09:11
    #40097448
DoctorRoot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
rdb_dev, спасибо за ответ. Дело в том, что я занимаюсь переходом из одной системы в другую. Значения хранятся в БД MS SQL, а алгоритм мне скинули программы из которой я осуществляю переход. Знать Си - это хорошо, вот только за последние 10 лет он встретился впервые :)
...
Рейтинг: 0 / 0
14.09.2021, 09:20
    #40097454
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Формулы приведения такие:
Код: plaintext
1.
2.
3.
День = 131596568 % 256
Месяц = Целое(131596568/256) % 256
Год = Целое(131596568/65536)


% - остаток от деления
Целое() - округление до целого вниз
...
Рейтинг: 0 / 0
14.09.2021, 12:31
    #40097534
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
DoctorRootЗнать Си - это хорошо, вот только за последние 10 лет он встретился впервые :)

А в дельфийском разделе тебе впервые встретился Дельфи. Почему вообще тебе
поручили эту работу?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.09.2021, 16:01
    #40097596
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Учитывая весь ужас происходящего я сильно рекомендую автору не трогать язык Си а
формулу перевода времени просто реализовать в Delphi.
...
Рейтинг: 0 / 0
14.09.2021, 19:13
    #40097651
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
mayton
Учитывая весь ужас происходящего я сильно рекомендую автору не трогать язык Си а
формулу перевода времени просто реализовать в Delphi.

Там изначально int-порно какое-то, лучше в тип date преобразовать один раз и забыть про это безобразие. Можно виртуальный столбец сделать, где будут полноценные даты. Средств MSSQL достаточно для конвертации.
...
Рейтинг: 0 / 0
14.09.2021, 20:20
    #40097661
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Зачем эти игры с целочисленным делением? В любом языке есть стандартное API
для работы с календарными расчетами. И надо иметь ооочень много оснований
чтобы делать что-то своё велосипедное в этом направлении.
...
Рейтинг: 0 / 0
14.09.2021, 21:11
    #40097669
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
mayton
Зачем эти игры с целочисленным делением? В любом языке есть стандартное API
для работы с календарными расчетами. И надо иметь ооочень много оснований
чтобы делать что-то своё велосипедное в этом направлении.

Потому что кто-то изобрел велосипед где, с учетом обратной записи при хранении, младший байт - это день, следующий - это месяц, а два оставшихся вместе - год.
...
Рейтинг: 0 / 0
14.09.2021, 22:18
    #40097678
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
BCD это, вообще-то довольно старый формат. Местами весьма удобный. Быстро
преобразуется, правильно сортируется.
https://www.digital-detective.net/binary-coded-decimal-timestamps/
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.09.2021, 22:22
    #40097680
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Dimitry Sibiryakov,

это не BCD, это изобретение нуба не знающего даже про time_t
...
Рейтинг: 0 / 0
14.09.2021, 22:26
    #40097681
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Dimitry Sibiryakov, формат внутреннего представления борландовского TDateTime тоже не очень сложен - double.
...
Рейтинг: 0 / 0
14.09.2021, 22:30
    #40097682
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Siemargl
Dimitry Sibiryakov,

это не BCD, это изобретение нуба не знающего даже про time_t
time_t не так уж удобен. Далеко не все языки умеют с ним работать и вручную его перевести в печатный формат не очень просто. Так что различные форматы дат очень даже востребованы.
Пока ты живешь в С/С++ мире - time_t действительно очень удобен. Переезжаешь в те-же базы данных и опаньки. Начинаешь считать что-нибудь и более-менее реальной астрономии и упираешься в начало эпохи.
В общем, нубы может и изобретают свои форматы, но вот гуру вспоминая свои нубские года удивляются собственной прозорливости.
...
Рейтинг: 0 / 0
14.09.2021, 22:32
    #40097683
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Но его не разложить на составляющие простыми битовыми операциями, формула там
довольно зубодробительная. Этот же формат явно для какого-то слабого железа был
сделан. Возможно даже без операции деления вообще.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.09.2021, 22:32
    #40097684
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
mayton
Зачем эти игры с целочисленным делением? В любом языке есть стандартное API
для работы с календарными расчетами. И надо иметь ооочень много оснований
чтобы делать что-то своё велосипедное в этом направлении.
Для соединения одного стандартного API с другим стандартным API.
...
Рейтинг: 0 / 0
14.09.2021, 22:35
    #40097687
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
White Owl, time_since_epoch, это ещё куда не шло... В борландовском TDateTime упираешься в 1899-12-30T00:00 :)
...
Рейтинг: 0 / 0
14.09.2021, 22:48
    #40097692
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Dimitry Sibiryakov

Но его не разложить на составляющие простыми битовыми операциями, формула там
довольно зубодробительная. Этот же формат явно для какого-то слабого железа был
сделан. Возможно даже без операции деления вообще.
Ты про double?
...
Рейтинг: 0 / 0
15.09.2021, 00:32
    #40097698
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
rdb_devТы про double?

Я про любой формат "XXX since epoch", включая, естественно, дельфийский
TDateTime и линуховый time_t.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.09.2021, 00:43
    #40097699
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
DoctorRoot
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 байт). Лучше распаковывать дату с помощью битовых операций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#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;
}
...
Рейтинг: 0 / 0
24.09.2021, 09:41
    #40099687
DoctorRoot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Dimitry Sibiryakov, спасибо за ответ. В дельфийском разделе мне ответили и я успешно применил этот код. То как это работает мне не было понятно, теперь я знаю. А что с этим какие-то есть проблемы?
...
Рейтинг: 0 / 0
24.09.2021, 09:46
    #40099690
DoctorRoot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
Dima T, спасибо большое! Язык С и не собирался трогать, это он ко мне полез )
...
Рейтинг: 0 / 0
24.09.2021, 11:53
    #40099712
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить результат выполнения
DoctorRootспасибо за ответ.

Вообще-то это был вопрос...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Получить результат выполнения / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]