Delphiで暗黙的なクラス演算子を使用して動的配列を含むレコードを初期化できるかどうかを確認しようとしています(Berlin 10.1 upd 1「暗黙の」クラス演算子を持つ動的配列を含むDelphiレコードの初期化
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 Iを初期化する動的配列を含むレコードのタイプである。)
添付のプログラムは、次の出力が生成します。
- ciは整数の定数配列です。
- iaは、整数の動的配列です。
- r1、r2、r3は、異なる方法で初期化されるタイプTRecのレコードです。
出力からわかるように、定数を使用する最初の2つの割り当て(r1、r2)は、期待どおりに機能します。 3番目の割り当て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(Copy-On-Write)を実行するようにしてください。**配列**が変更されるたびに、そのコピーが一意のコピーであることを確認する必要があります。 –
@RudyVelthuisコンパイラのバグはそれを可能にしません。あなたがそのバグを回避したり、ベンダーからの修正を得ない限り。 –
さて、 'Implicit()'のdynarray * parameters *は特殊なケースです。それ以外の場合は動作します。レコードには、dynarrayを含めることができます。 –