delphi - 双循环索引问题
问题描述
我今天一直在学习Delphi,但遇到了一个奇怪的错误:
type
TMatriz = array[1..10,1..10] of Integer;
var
i, j: Integer;
tablaDeMultiplicar: TMatriz;
begin
for i := 1 to 10 do
begin
for j := 1 to 10 do
begin
tablaDeMultiplicar[i-1,j-1] := i*j;
end;
end;
for i := 0 to 9 do
begin
for j := 0 to 9 do
begin
Write(tablaDeMultiplicar[i,j]:6);
end;
Writeln;
end;
Readln;
end.
据我所知,这将显示乘法表。现在它显示一行 1 2 ... 9 0,其余为 0。
当我尝试将索引从 1 和 10 更改为 0 和 9 并相应地调整行时,它什么也没显示。我尝试了另一件事,但我只是让它以这种方式工作:
我从这里得到的唯一结论是,您不能使用 for 的 var 进行操作:/
解决方案
您的指数减少了 1。您tablaDeMultiplicar
的声明为:
TMatriz = array[1..10,1..10] of Integer;
有索引[1..10, 1..10]
但是您使用索引 0..9 和 0..9 访问它:
for i := 1 to 10 do
begin
for j := 1 to 10 do
begin
tablaDeMultiplicar[i-1,j-1] := i*j; // i-1 and j-1 are 0..9 each
将其更改为:
tablaDeMultiplicar[i,j] := i*j;
并更改您的第二组循环。总而言之:
{$R+}{$Q+}
type
TMatriz = array[1..10, 1..10] of Integer;
var
i, j: Integer;
tablaDeMultiplicar: TMatriz;
begin
for i := 1 to 10 do
begin
for j := 1 to 10 do
begin
tablaDeMultiplicar[i, j] := i * j;
end;
end;
for i := 1 to 10 do
begin
for j := 1 to 10 do
begin
Write(tablaDeMultiplicar[i, j]:6);
end;
Writeln;
end;
Readln;
end.
注意:没有1..11
或for 0 to 10 do
任何地方。1
并且10
一直如此,因为这就是你声明的方式TMatriz
。
编译并按预期工作:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
并注意@LURD 的这个提示:在开发阶段激活范围和溢出检查。这将很快捕捉到这些错误。
此外,如果您遇到此类问题,请尝试调试您的代码。这比你想象的要容易。