gpt4 book ai didi

delphi - 将 TArray 类型转换为 X 数组是否安全?

转载 作者:行者123 更新时间:2023-12-03 14:35:54 25 4
gpt4 key购买 nike

今天我发现了一个编译器错误 ( QC#108577 )。

以下程序无法编译:

program Project1;
{$APPTYPE CONSOLE}

procedure P(M: TArray<TArray<Integer>>);
begin
SetLength(M, 1, 2);
end;

begin
end.

编译器对 SetLength 打趣线并说:

[dcc32 Error] E2029 ')' expected but ',' found

我知道我可以这样修复它:

procedure P(M: TArray<TArray<Integer>>);
var
i: Integer;
begin
SetLength(M, 1);
for i := low(M) to high(M) do
SetLength(M[i], 2);
end;

但我自然希望避免诉诸于此。

以下变体可以编译并且似乎可以工作:

procedure P(M: TArray<TArray<Integer>>);
type
TArrayOfArrayOfInteger = array of array of Integer;
begin
SetLength(TArrayOfArrayOfInteger(M), 1, 2);
end;

对动态数组的实现细节了解不够,TArray<T>转换、引用计数等以确保这是安全的。

是否有人知道足够多的知识来以某种方式说出这是否会在运行时生成正确的代码?

最佳答案

编译器内部过程SetLength在堆栈上动态构造一个维度数组,并为任何动态数组(无论是否通用)调用DynArraySetLength。如果通用数组在结构上与常规动态数组不兼容,则可能不会调用用于设置长度的相同实现。

事实上documentation DynArraySetLength 提供 SetLength 作为多维数组的替代方案。也可以使用 DynArraySetLength 来代替类型转换,但我认为没有任何理由选择其中之一。

关于delphi - 将 TArray<X> 类型转换为 X 数组是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com