我正在学习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来编译程序。
答案 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);