Delphi 如何在不使用pascal中的for循环的情况下一次设置多个数组字段?

Delphi 如何在不使用pascal中的for循环的情况下一次设置多个数组字段?,delphi,delphi-6,Delphi,Delphi 6,我正在学习Pascal,目前遇到了一个有关数组操作的问题。我遇到了一种设置数组的方法,我在其他语言中也见过这种方法,但我不知道如何在Pascal中做类似的事情 变量的声明如下所示: rotationBounds: array of array of integer; setLength(rotationBounds, 5, 5); rotationBounds := [ [0, 0, 0, 0, 0], [0, 1, 1, 0, 0]

我正在学习Pascal,目前遇到了一个有关数组操作的问题。我遇到了一种设置数组的方法,我在其他语言中也见过这种方法,但我不知道如何在Pascal中做类似的事情

变量的声明如下所示:

rotationBounds: array of array of integer;
setLength(rotationBounds, 5, 5);
 rotationBounds :=
         [
          [0, 0, 0, 0, 0],
          [0, 1, 1, 0, 0],
          [0, 0, 1, 0, 0],
          [0, 0, 1, 1, 0],
          [0, 0, 0, 0, 0],
         ]; 
var
  rotationBounds: TIntegerMatrix;
....
rotationBounds := IntegerMatrix([
  IntegerArray([0, 0, 0, 0, 0]),
  IntegerArray([0, 1, 1, 0, 0]),
  IntegerArray([0, 0, 1, 0, 0]),
  IntegerArray([0, 0, 1, 1, 0]),
  IntegerArray([0, 0, 0, 0, 0]),
]);
我想这样做:

rotationBounds: array of array of integer;
setLength(rotationBounds, 5, 5);
 rotationBounds :=
         [
          [0, 0, 0, 0, 0],
          [0, 1, 1, 0, 0],
          [0, 0, 1, 0, 0],
          [0, 0, 1, 1, 0],
          [0, 0, 0, 0, 0],
         ]; 
var
  rotationBounds: TIntegerMatrix;
....
rotationBounds := IntegerMatrix([
  IntegerArray([0, 0, 0, 0, 0]),
  IntegerArray([0, 1, 1, 0, 0]),
  IntegerArray([0, 0, 1, 0, 0]),
  IntegerArray([0, 0, 1, 1, 0]),
  IntegerArray([0, 0, 0, 0, 0]),
]);
基本上,我试图直接设置一个多维数组,而不是在其中循环

我的重点之一是使它看起来像一张图片,易于阅读和理解

我有没有办法做到这一点

我正在使用Borland Delphi 6编译该程序。

您可以将其与(在变量声明中)一起使用

const temp: array[1..5, 1..5] of integer = (
   (0,0,0,0,0),
   (0,1,1,0,0),
   (0,0,1,0,0),
   (0,0,1,1,0),
   (0,0,0,0,0)
   );
然后

rotationBounds := temp;
如果您有一个动态数组,您可以编写自己的函数: 逐行:

procedure setrow(var a: array of integer; b: array of integer);
begin
  if length(a) <> length(b) then raise Exception.Create('Invalid size');
  move(b[0], a[0], length(a) * sizeof(a[0]));
end;  

setrow(a[0], [0,0,0,0,0]);
setrow(a[1], [0,1,1,0,0]);
setrow(a[2], [0,0,1,0,0]);
setrow(a[3], [0,0,1,1,0]);
setrow(a[4], [0,0,0,0,0]);
procedure setrow(变量a:整数数组;b:整数数组);
开始
如果长度(a)为长度(b),则引发异常。Create('Invalid size');
移动(b[0],a[0],长度(a)*sizeof(a[0]);
结束;
setrow(a[0],[0,0,0,0]);
setrow(a[1],[0,1,1,0,0]);
setrow(a[2],[0,0,1,0,0]);
setrow(a[3],[0,0,1,1,0]);
setrow(a[4],[0,0,0,0]);
或全部:

type TIntArrayArray = array of array of integer;
procedure setall(var a: TIntArrayArray; b: array of integer);
var
  i: Integer;
begin
  if (length(a)*length(a[0]) <> length(b)) then raise Exception.Create('Invalid size');
  for i:= 0 to high(a) do
    move(b[i*length(a[0])], a[i,0], length(a[0]) * sizeof(a[0,0]));
end;              

setall(a, [0,0,0,0,0,
           0,1,1,0,0,
           0,0,1,0,0,
           0,0,1,1,0,
           0,0,0,0,0]);  
类型TIntArrayArray=整数数组的数组;
过程setall(变量a:TIntArrayArray;b:integer数组);
变量
i:整数;
开始
如果是(长度(a)*长度(a[0])长度(b)),则引发异常。Create('Invalid size');
对于i:=0到高(a)do
移动(b[i*length(a[0]),a[i,0],length(a[0])*sizeof(a[0,0]);
结束;
setall(a,[0,0,0,0,0,0,0,
0,1,1,0,0,
0,0,1,0,0,
0,0,1,1,0,
0,0,0,0,0]);  

Delphi 6不支持除循环之外的任何其他初始化动态数组的方法,因此您运气不好

较新版本的Delphi支持构造函数类型初始化:

type
  TIntArray = array of Integer;

var
  IntArray: TIntArray;
begin
  IntArray := TIntArray.Create(0, 0, 1, 1, 0, 0, 1, 0, 0);

在Delphi 6中,没有内置的对动态数组初始化的支持。为此,我将使用一对帮助函数:

type
  TIntegerArray = array of Integer;
  TIntegerMatrix = array of TIntegerArray;

function IntegerArray(const Values: array of Integer): TIntegerArray;
var
  i: Integer;
begin
  SetLength(Result, Length(Values));
  for i := 0 to high(Result) do
    Result[i] := Values[i];
end;

function IntegerMatrix(const Values: array of TIntegerArray): TIntegerMatrix;
var
  i: Integer;
begin
  SetLength(Result, Length(Values));
  for i := 0 to high(Result) do
    Result[i] := Values[i];
end;
然后这样称呼它:

rotationBounds: array of array of integer;
setLength(rotationBounds, 5, 5);
 rotationBounds :=
         [
          [0, 0, 0, 0, 0],
          [0, 1, 1, 0, 0],
          [0, 0, 1, 0, 0],
          [0, 0, 1, 1, 0],
          [0, 0, 0, 0, 0],
         ]; 
var
  rotationBounds: TIntegerMatrix;
....
rotationBounds := IntegerMatrix([
  IntegerArray([0, 0, 0, 0, 0]),
  IntegerArray([0, 1, 1, 0, 0]),
  IntegerArray([0, 0, 1, 0, 0]),
  IntegerArray([0, 0, 1, 1, 0]),
  IntegerArray([0, 0, 0, 0, 0]),
]);

信息不足。数组是变量还是常量?是静态的还是动态的?Pascal/Delphi/FPC的哪个版本?(支持的功能各不相同)。如果需要矩阵,动态数组的动态数组是多余的,因为所有元素的类型必须相同,矩阵必须是矩形的(稀疏矩阵及其应用程序的显著例外)我可以在创建数组后使用此方法吗?它是一个整数数组的动态数组;@Rasteril:你在使用什么编译器?在FPC trunk和最近的Delphi中,你可以使用动态数组构造函数()我使用的是Borland Delphi 6,我不确定它可能是什么编译器。有什么方法可以找到吗?那就是Borland Delphi 6编译器:-)使用静态数组,或一维数组(包含25个元素)通常效率更高。使用2d数组,您只需编写自己的函数。请参阅编辑。这太可惜了。感谢您的澄清。这是最干净的解决方案!