powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Получить результат выполнения
23 сообщений из 23, страница 1 из 1
Получить результат выполнения
    #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
Получить результат выполнения
    #40097362
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoctorRoot, написать return вместо printf, но лучше изучить Си.
...
Рейтинг: 0 / 0
Получить результат выполнения
    #40097409
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoctorRoot,

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

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

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


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

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

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

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

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

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

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

Я про любой формат "XXX since epoch", включая, естественно, дельфийский
TDateTime и линуховый time_t.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Получить результат выполнения
    #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
Получить результат выполнения
    #40099687
DoctorRoot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, спасибо за ответ. В дельфийском разделе мне ответили и я успешно применил этот код. То как это работает мне не было понятно, теперь я знаю. А что с этим какие-то есть проблемы?
...
Рейтинг: 0 / 0
Получить результат выполнения
    #40099690
DoctorRoot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, спасибо большое! Язык С и не собирался трогать, это он ко мне полез )
...
Рейтинг: 0 / 0
Получить результат выполнения
    #40099712
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoctorRootспасибо за ответ.

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


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