4

我正在学习 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],
         ]; 

基本上,我试图直接设置一个多维数组,而不是循环遍历它。

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

有没有办法可以实现这样的目标?

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

4

3 回答 3

3

在 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;

然后这样称呼它:

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]),
]);
于 2013-05-04T16:01:56.313 回答
2

您可以将其与 ( 在变量声明中

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]);

或者一起:

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]);  
于 2013-05-04T15:01:08.077 回答
1

Delphi 6 不支持除循环之外的任何其他初始化动态数组的方法,所以你不走运。

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

type
  TIntArray = array of Integer;

var
  IntArray: TIntArray;
begin
  IntArray := TIntArray.Create(0, 0, 1, 1, 0, 0, 1, 0, 0);
于 2013-05-04T15:12:40.090 回答