Double for循环索引问题

时间:2018-10-12 19:15:26

标签: delphi for-loop matrix

我今天一直在学习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并一致地调整行时,它什么也没显示。我尝试了另一种方法,但只能以这种方式工作:

Program working weirdly

我从这里得到的唯一结论是,您不能使用for:/

的vars

1 个答案:

答案 0 :(得分:5)

您的索引偏离了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 do110一直如此,因为这就是您声明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注意此提示:在开发阶段激活范围和溢出检查。这将很快捕获此类错误

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