Delphi 在多维动态数组中需要完成什么?

Delphi 在多维动态数组中需要完成什么?,delphi,arrays,Delphi,Arrays,我经常使用动态数组,对SetLength和Finalize过程没有任何问题 我最近有理由使用动态数组,其中每个数组元素本身可以包含可变数量的元素。宣言是这样的: TScheduleArray = array of array of array [1..DaysPerWeek] of TShiftType; 软件运行良好,我对如何使用这种结构没有问题。在主数组上调用SetLength,然后可以在每个数组元素上再次调用SetLength。这是预期的工作 SetLength(MyArray, 1)

我经常使用动态数组,对SetLength和Finalize过程没有任何问题

我最近有理由使用动态数组,其中每个数组元素本身可以包含可变数量的元素。宣言是这样的:

TScheduleArray =  array of array of array [1..DaysPerWeek] of TShiftType;
软件运行良好,我对如何使用这种结构没有问题。在主数组上调用SetLength,然后可以在每个数组元素上再次调用SetLength。这是预期的工作

SetLength(MyArray, 1);
SetLength(MyArray[0], 2);
我的问题是:当我释放用于此数组的资源时,是否只调用数组变量Finalize:

Finalize(MyArray);

还是每个数组元素也需要最终确定,因为每个元素本身就是一个动态数组?

数组由编译器管理,不需要最终确定。如果TShiftType是一个类,则必须手动释放对象,一次释放一个对象,但数组本身在超出范围时将被正确处理

引用: “在主数组上调用SetLength 然后可以在上再次调用SetLength 每个数组元素。”

您实际上不必遍历数组

SetLength()
接受每个维度的长度列表

示例:

SetLength(ScheduleArray,200,15,35);
同:

SetLength(ScheduleArray,200);
for i:=low(ScheduleArray) to high(ScheduleArry) do
begin
  SetLength(ScheduleArray[i],15);
  for j:=low(ScheduleArray[i]) to high(ScheduleArray[i]) do
    SetLength(ScheduleArray[i,j],35);
end;

要释放任何动态数组,只需将其指定为nil 例如:

a:array of array of integer;
要免费使用,请使用:

a:=nil;  

啊,是的,我在Delphi帮助中看到“如果Finalize调用中指定的变量不包含长字符串、变量或接口,编译器将消除该调用,并且不为其生成代码。”TShiftType是枚举类型,因此没有对象。所以一直以来我都非常小心地调用Finalize,编译器一直在消除调用?!是的!动态数组和记录由您保管。谢谢,这很有用。虽然如果数组不是矩形,这不起作用。(此外,尽管很有趣,但这并不是问题的答案。)