我试图用二维数组表示一个二维坐标网格。问题是,由于Delphi分配数组的方式,声明数组翻转了X和Y坐标。这使得很难读取数组的元素。例如,以下程序在尝试打印时给出了范围检查错误:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
{$R+}
procedure play;
var
grid: array of array of boolean;
x, y: integer;
begin
try
setLength(grid, 3, 8);
grid[1, 5] := true;
for y := low(grid) to high(grid) do
begin
for x := low(grid[y]) to high(grid[y]) do
begin
if grid[x, y] then
write('X')
else write('.');
end;
writeln;
end;
readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end;
begin
play;
end.
我必须向后写索引(如果使用grid [y,x]),以防止这种情况发生,但随后网格将横向打印出来,其中X显示为(5,1)而不是(1,5)。如果我尝试通过说setLength(grid,3,8)改变网格的形状;那么下一行的赋值将给出范围检查错误。我最终不得不将所有坐标都向后写入,而每当我忘记它们向后写入时,坏的事情最终就会在程序中发生。
有谁知道使坐标顺序直观工作的技巧?
最佳答案
您只需要在for语句中给出适当的界限即可。将低和高函数应用于多维数组时,请务必小心。对于当前示例(二维数组),low(grid)和high(grid)将返回第一维(行)的限制,而low(grid [0])和high(grid [0])将返回返回第一列的限制(假设它存在)。请注意以下更改的限制:
program Play_console;
{$APPTYPE CONSOLE}
uses
SysUtils;
{$R+}
procedure play;
var
grid: array of array of boolean;
x, y: integer;
begin
try
setLength(grid, 3, 8);
grid[1, 5] := true;
for y := low(grid[0]) to high(grid[0]) do
begin
for x := low(grid) to high(grid) do
begin
if grid[x, y] then
write('X')
else write('.');
end;
writeln;
end;
readln;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end;
begin
play;
end.
我对此进行了测试,它似乎确实可以满足您的要求。
关于delphi - 如何在Delphi中表示坐标网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1081088/