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

时间:2013-05-04 14:55:15

标签: 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],
          [0, 0, 1, 0, 0],
          [0, 0, 1, 1, 0],
          [0, 0, 0, 0, 0],
         ]; 

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

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

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

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

3 个答案:

答案 0 :(得分: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]),
]);

答案 1 :(得分: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]);  

答案 2 :(得分: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);