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

Как его можно написать для Delphi?

Код: 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, 19:48
    #40097355
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TDateLP = record
  day: Byte;
  month: Byte;
  year: Word;
  procedure longToDate(val: Cardinal);
end;

procedure TDateLP.longToDate(val: Cardinal);
begin
  Self := TDateLP(val);
  Writeln(Format('%.2d/%.2d/%.2d', [day, month, year]));
end;
...
Рейтинг: 0 / 0
13.09.2021, 20:16
    #40097360
DoctorRoot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
_Vasilisk_, всё работает как надо, спасибо большое! Подскажите, пожалуйста, каким образом в строке "Self := TDateLP(val);" получается дата?
...
Рейтинг: 0 / 0
13.09.2021, 22:05
    #40097377
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
DoctorRootкаким образом

Тем же самым, что и на Си: грязным хаком с интерпретацией куска оперативной памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2021, 22:09
    #40097380
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
DoctorRoot
каким образом в строке "Self := TDateLP(val);" получается дата?
У вас размер TDateLP 4 байта. Младший байт - день, второй байт - месяц. Два старших - год. Размер long/Cardinal тоже 4 байта. Значит, достаточно сделать простое приведение типов.

Если эту строку
DoctorRoot
Код: plaintext
1.
*(long*)&day = val;

переписывать дословно, то получится так
Код: pascal
1.
PCardinal(@day)^ := val;
...
Рейтинг: 0 / 0
13.09.2021, 22:20
    #40097383
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
Колдунство прям какое то:)
...
Рейтинг: 0 / 0
13.09.2021, 22:25
    #40097384
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
ABI, ничего личного
...
Рейтинг: 0 / 0
14.09.2021, 09:20
    #40097455
DoctorRoot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
_Vasilisk_, огромное Вам спасибо! Век живи, век учись :)
...
Рейтинг: 0 / 0
21.09.2021, 09:23
    #40098875
black-manatee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
А не стоит ли вместо record использовать packed record ?
Вроде при определенных обстоятельствах record может поля не впритык размещать в памяти..
...
Рейтинг: 0 / 0
21.09.2021, 09:50
    #40098883
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
black-manatee
А не стоит ли вместо record использовать packed record ?
Вроде при определенных обстоятельствах record может поля не впритык размещать в памяти..
Эта проблема вроде как неактуальна уже лет как 20.
...
Рейтинг: 0 / 0
21.09.2021, 10:24
    #40098892
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
L_argo
Эта проблема вроде как неактуальна уже лет как 20.

Это ещё с какого пуркуа?
...
Рейтинг: 0 / 0
24.09.2021, 11:26
    #40099703
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
black-manatee
Вроде при определенных обстоятельствах record может поля не впритык размещать в памяти..
Может. Но здесь этих обстоятельств нет. Кроме того, в приведенном коде на C++ упаковки нет
...
Рейтинг: 0 / 0
25.09.2021, 19:12
    #40100034
black-manatee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
_Vasilisk_
black-manatee
Вроде при определенных обстоятельствах record может поля не впритык размещать в памяти..
Может. Но здесь этих обстоятельств нет. Кроме того, в приведенном коде на C++ упаковки нет


Ну сейчас нет. А потом кодер добавит пару полей, они и появятся. Лучше перебдеть и написать packed, чем каждый раз не забывать пересчитывать смещения полей.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
  TDateLP = record
    day: Byte;
    month: Byte;
    year: Word;
    Additional_very_important_data: array[0..4] of byte;
    Seconds_from_midnight: integer;
  end;

Var d: TDateLP;
begin
  Writeln(Format('Ожидаемое смещение для секунд: %d',
    [SizeOf(d.day) + SizeOf(d.month) + SizeOf(d.year) + SizeOf(d.Additional_very_important_data)]));

  Writeln(Format('Реальное смещение для секунд: %d',
    [Integer(Addr(d.Seconds_from_midnight)) - Integer(Addr(d.day))]));
end;
...
Рейтинг: 0 / 0
25.09.2021, 19:41
    #40100037
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
black-manateeА потом кодер добавит пару полей, они и появятся.

Не появятся. Если только он не добавит поля в начало структуры. Но зачем бы
кто-то это делал?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.09.2021, 13:28
    #40100074
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
black-manatee
Лучше перебдеть и написать packed,
Читать умеете?
_Vasilisk_
в приведенном коде на C++ упаковки нет

black-manatee
Код: pascal
1.
('Ожидаемое смещение для секунд: %d'

Для кого ожидаемое?
...
Рейтинг: 0 / 0
26.09.2021, 20:42
    #40100116
black-manatee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
_Vasilisk_
black-manatee
Лучше перебдеть и написать packed,
Читать умеете?
_Vasilisk_
в приведенном коде на C++ упаковки нет

black-manatee
Код: pascal
1.
('Ожидаемое смещение для секунд: %d'

Для кого ожидаемое?


Ожидаемое для того, кто забыл или не знал: чем packed record отличается от просто record.
Хуже от префикса "packed" не будет (ну если только не хотите сэкономить пару микросекунд).
А вот от отсутствия префикса хуже быть может, ну во всяком случае есть ненулевая вероятность.
...
Рейтинг: 0 / 0
26.09.2021, 21:21
    #40100117
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
black-manatee
Хуже от префикса "packed" не будет

Тролль, что ли. Исходная структура на С++ - без #pragma pack .
...
Рейтинг: 0 / 0
27.09.2021, 13:40
    #40100191
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
black-manatee
Хуже от префикса "packed" не будет
Серьезно?
Советую перечитать документацию
black-manatee
кто забыл или не знал: чем packed record отличается от просто record.
И там вы сможете найти, что такой вещи как "просто record" не существует. А существуют структуры (причем как в Делфи, так и в С) с определенным значением выравнивания полей. И оно может быть 1, 2, 4 и 8 байт
...
Рейтинг: 0 / 0
27.09.2021, 16:55
    #40100267
Bred eFeM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как написать на Delphi
ъъъъъ, _Vasilisk_, работы нет, что ли. Чёт вы ребятки засиделись на форуме.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как написать на Delphi / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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