加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 将TArray键入到数组X是安全的吗?

发布时间:2020-12-15 10:05:50 所属栏目:大数据 来源:网络整理
导读:今天我发现了一个编译器bug( QC#108577). 以下程序无法编译: program Project1;{$APPTYPE CONSOLE}procedure P(M: TArrayTArrayInteger);begin SetLength(M,1,2);end;beginend. 编译器在SetLength行上表示: [dcc32 Error] E2029 ')' expected but ',' foun
今天我发现了一个编译器bug( 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),2);
end;

我对动态数组的实现细节不够了解,TArray< T>铸造,参考计数等,以确保这是安全的.

有没有人知道足够的话说出一种方式,无论这是否会在运行时产生正确的代码?

解决方法

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

事实上,documentation的DynArraySetLength提供了SetLength作为多维数组的替代.也可以使用DynArraySetLength而不是类型转换,但是我没有看到任何理由喜欢一个或另一个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读