Delphi 如何在不使用pascal中的for循环的情况下一次设置多个数组字段?
我正在学习Pascal,目前遇到了一个有关数组操作的问题。我遇到了一种设置数组的方法,我在其他语言中也见过这种方法,但我不知道如何在Pascal中做类似的事情 变量的声明如下所示: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]
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数组,您只需编写自己的函数。请参阅编辑。这太可惜了。感谢您的澄清。这是最干净的解决方案!