powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как написать на Delphi
19 сообщений из 19, страница 1 из 1
Как написать на Delphi
    #40097343
DoctorRoot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток! Скинули готовый фрагмент кода на С++ в котором из числа получают дату.
Например вводим число: 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
Как написать на Delphi
    #40097355
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как написать на Delphi
    #40097360
DoctorRoot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, всё работает как надо, спасибо большое! Подскажите, пожалуйста, каким образом в строке "Self := TDateLP(val);" получается дата?
...
Рейтинг: 0 / 0
Как написать на Delphi
    #40097377
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoctorRootкаким образом

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

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

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

Это ещё с какого пуркуа?
...
Рейтинг: 0 / 0
Как написать на Delphi
    #40099703
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
black-manatee
Вроде при определенных обстоятельствах record может поля не впритык размещать в памяти..
Может. Но здесь этих обстоятельств нет. Кроме того, в приведенном коде на C++ упаковки нет
...
Рейтинг: 0 / 0
Как написать на Delphi
    #40100034
black-manatee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_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
Как написать на Delphi
    #40100037
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
black-manateeА потом кодер добавит пару полей, они и появятся.

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

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

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

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

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


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

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


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