Я пытаюсь выяснить, можно ли инициализировать запись, содержащую динамический массив, с помощью оператора "неявного" класса в Delphi (Berlin 10.1 upd 1)
Прилагаемая программа производит следующий вывод:
ci iA r1 r2 r3
1 1 1 1 49694764491115752
2 2 2 2 11570520
3 3 3 3 0
4 4 4 4 0
5 5 5 5 0
- TRec - это тип записи, содержащий динамический массив, который я хочу инициализировать.
- ci - это постоянный массив целого числа.
- ia - это динамический массив целых чисел.
- r1, r2, r3 - это записи типа TRec, которые инициализируются разными способами.
Как видно из вывода, первые два назначения (r1, r2), использующие константы, работают как ожидалось. Третье назначение r3 := iArray
принимается компилятором, но результат не работает. Отладчик показывает, что значение v
в TRec.Implicit
уже неверно.
Что здесь происходит? Это вообще возможно?
program Project5;
{$APPTYPE CONSOLE}
{$R *.res}
type
TRec = record
iArray: array of UInt64;
class operator Implicit(const v: array of UInt64): TRec;
end;
{ TRec }
class operator TRec.Implicit(const v: array of UInt64): TRec;
var
i: integer;
begin
setlength(Result.iArray, Length(v));
for i := 0 to High(v) do
Result.iArray[i] := v[i];
end;
const
ciArray: array [0 .. 4] of UInt64 = (1, 2, 3, 4, 5);
var
i : integer;
iArray : array of UInt64;
r1, r2, r3: TRec;
begin
iArray := [1, 2, 3, 4, 5];
r1 := [1, 2, 3, 4, 5];
r2 := ciArray;
r3 := iArray;
Writeln('ci iA r1 r1 r3');
for I := 0 to High(ciArray) do
Writeln(ciArray[i], ' ', iArray[i], ' ', r1.iArray[i], ' ', r2.iArray[i], ' ', r3.iArray[i]);
readln;
end.