双循环索引问题

Gui*_*lla -4 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.
Run Code Online (Sandbox Code Playgroud)

据我所知,这显示了乘法表.现在它显示一行1 2 ... 9 0,其余为0.

当我尝试将索引从1和10更改为0和9并按顺序调整行时,它什么也没有显示.我尝试了另外的东西,我只是这样工作:

程序很奇怪

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

Rud*_*uis 5

您的指数偏离1.您tablaDeMultiplicar被声明为:

TMatriz = array[1..10,1..10] of Integer;
Run Code Online (Sandbox Code Playgroud)

这有指数 [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
Run Code Online (Sandbox Code Playgroud)

将其更改为:

    tablaDeMultiplicar[i,j] := i*j;
Run Code Online (Sandbox Code Playgroud)

并改变你的第二组循环.总而言之:

{$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.
Run Code Online (Sandbox Code Playgroud)

注意:没有1..11for 0 to 10 do任何地方.110所有的时间,因为这是你如何申报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
Run Code Online (Sandbox Code Playgroud)

并注意@LURD的这个提示:在开发阶段激活范围和溢出检查.这将很快发现这些错误.

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