首页 > 解决方案 > 双循环索引问题

问题描述

我今天一直在学习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 进行操作:/

标签: delphifor-loopmatrix

解决方案


您的指数减少了 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..11for 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 的这个提示:在开发阶段激活范围和溢出检查。这将很快捕捉到这些错误

此外,如果您遇到此类问题,请尝试调试您的代码。这比你想象的要容易。


推荐阅读