我正试图弄清楚是否可以使用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
,但结果是错误的。调试器显示在TRec.Implicit
中的v
值已经出现了问题。
这里出了什么问题?这可能吗?
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.
BigInteger
类型(http://www.rvelthuis.de/programs/bigintegers.html) 这样做。但请确保执行某种写时复制(COW),因此每次修改 数组 时,您必须确保它是唯一的副本。 - Rudy VelthuisImplicit()
函数中的dynarray parameters是一个特殊情况。否则它可以正常工作。该记录可以包含一个dynarray。 - Rudy Velthuis