@PatrickvL:
对不起,但这完全是错误的。您的代码甚至无法编译,因为它试图为一维元素 List[x] 设置二维。 (PatrickvL 更新了他的代码,因此这部分答案不再有效。) em>
以下代码演示了多维数组的大小调整。
程序测试维度;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
List: array of array of integer;
begin
//set both dimensions
SetLength(List, 3, 2);
Writeln('X = ', Length(List), ', Y = ', Length(List[0])); //X = 3, Y = 2
//set main dimension to 4, keep subdimension untouched
SetLength(List, 4);
Writeln('X = ', Length(List), ', Y = ', Length(List[0])); //X = 4, Y = 2
//set subdimension to 3, keep main dimenstion untouched
SetLength(List, Length(List), 3);
Writeln('X = ', Length(List), ', Y = ', Length(List[0])); //X = 4, Y = 3
//all List[0]..List[3] have 3 elements
Writeln(Length(List[0]), Length(List[1]), Length(List[2]), Length(List[3])); //3333
//you can change subdimension for each List[] vector
SetLength(List[0], 1);
SetLength(List[3], 7);
//List is now a ragged array
Writeln(Length(List[0]), Length(List[1]), Length(List[2]), Length(List[3])); //1337
//this does not even compile because it tries to set dimension that does not exist!
// SetLength(List[0], Length(List[0]), 12);
Readln;
end.
Delphi 帮助也很好地解释了这一点(结构化类型、数组)。
多维动态数组
要声明多维动态数组,请使用 ... 构造的迭代数组。例如,
type TMessageGrid = 字符串数组;
var Msgs: TMessageGrid;
声明一个二维字符串数组。要实例化此数组,请使用两个整数参数调用 SetLength。例如,如果我
和 J 是整数值变量,
SetLength(Msgs,I,J);
分配一个 I-by-J 数组,Msgs[0,0] 表示该数组的一个元素。
您可以创建非矩形的多维动态数组。第一步是调用 SetLength,将数组的前 n 维参数传递给它。例如,
var Ints:Integer 数组数组;
设置长度(整数,10);
为 Ints 分配 10 行但没有列。稍后,您可以一次分配一个列(给它们不同的长度);例如
SetLength(Ints[2], 5);
使 Ints 的第三列长为五个整数。此时(即使尚未分配其他列)您可以将值分配给第三列 - 例如 Ints[2,4] := 6。
以下示例使用动态数组(以及在 SysUtils 单元中声明的 IntToStr 函数)来创建字符串的三角矩阵。
变量
A : 字符串数组的数组;
I, J : 整数;
开始
SetLength(A, 10);
对于 I := 低 (A) 到高 (A) 做
开始
SetLength(A[I], I);
对于 J := Low(A[I]) to High(A[I]) do
A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' ';
结束;
结尾;