Dynamic 多维数组上的SetLength

Dynamic 多维数组上的SetLength,dynamic,multidimensional-array,pascal,Dynamic,Multidimensional Array,Pascal,我想知道如何在Pascal中设置多维数组的长度/创建动态多维数组。像SetLength(arr,len)一样,它也适用于一维数组。我找不到答案 var arr: array of array of real; ... SetLength(arr, 10, 20); // creates a 10 by 20 matrix 做这件事的一个糟糕但相当的方法是 SetLength(arr, 10); for i := low(arr) to high(arr) do SetLength(

我想知道如何在Pascal中设置多维数组的长度/创建动态多维数组。像
SetLength(arr,len)
一样,它也适用于一维数组。我找不到答案

var
  arr: array of array of real;

...

SetLength(arr, 10, 20); // creates a 10 by 20 matrix
做这件事的一个糟糕但相当的方法是

SetLength(arr, 10);
for i := low(arr) to high(arr) do
  SetLength(arr[i], 20);

但是,后一种方法允许使用“非矩形”数组。

有人可能会说pascal不支持多维动态数组,而只支持动态数组的动态数组。不仅支持“动态数组的动态数组”,还支持动态数组的动态数组,以及动态数组的动态数组的动态数组的动态数组,以及。。。呃。。。坦白说,“多维动态数组”似乎要短得多在免费Pascal/Lazarus下正常工作!为什么第二条路是“坏的”?我猜它将生成多个内存分配,并且不必要地复制只包含0的内容。dummzeuch:我知道这是一个非常古老的问题,但我想澄清,正如答案中所述,第一种和第二种方法实际上是等效的。它们都生成相同数量、相同大小甚至相同顺序的内存分配。唯一的区别是,在第一个示例中,SetLength执行循环,而在第二个示例(“坏”示例)中,示例代码执行循环。