For循环在达到目标后继续进行。 Delphi

For loop continue going after reaching goal. Delphi

这个问题只出现在数字上,大于 12 包括。

那两张照片是一次拍的。怎么可能?

For 循环必须从 0 到 12-1=11,不是吗?

然而,当我改用 while 循环时,它工作正常。

是我的错还是Delphi的错?

P.S。代码如下。

unit Unit1;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  n:Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);    //Button, that sets array length
var
  i, index:Integer;
begin
    val(Edit1.Text, n, index);                  
    if(index<>0) then
    begin
      ShowMessage('Wrong number');
      Edit1.Clear();
      exit;
    end;
    StringGrid1.ColCount:=n;
    for i:=0 to n-1 do                           
      StringGrid1.Cells[i,0]:=IntToStr(i+1);
    StringGrid1.SetFocus();
end;

procedure TForm1.Button2Click(Sender: TObject);        //Main button
var
  i, index:Integer;
  a:array[0..10] of Real;
  denom, sum:Real;
begin
  i:=0;
  sum:=0;
  denom:=-1;

 //that for loop from screenshot is here

  for i:=0 to n-1 do
  //while i<=(n-1) do
  begin
    Val(StringGrid1.cells[i,1], a[i], index);    
    if(index<>0) then
    begin
      ShowMessage('Wrong number with ' + IntToStr(i+1) + ' Id');
      StringGrid1.Col:=i;
      StringGrid1.Row:=1;
      StringGrid1.SetFocus();
      exit;
    end;
    a[i]:=a[i]/denom;                            
    sum:=sum+a[i];
    StringGrid1.Cells[i,2]:=FloatToStrF(a[i],ffFixed,5,3);    
    denom:=-denom*(i+2);
    //Inc(i);
    end;
    Label2.Caption:=FloatToStrF(sum,ffFixed,5,3);
end;

//code down bellow just allow to go to another cell by pressing Enter


procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if  (Key=#13) and (StringGrid1.Col=(n-1)) then   
      Button2.SetFocus()
  else if (Key=#13) and (StringGrid1.Col<>(n-1)) then
      StringGrid1.Col:=StringGrid1.Col+1;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Close();
end;

end.

阵列a尺寸较小,然后是单元格数量。

关于回答你的问题 'how is this even possible'...

在你的屏幕上,n 是 12。正如 Kermation 所指出的,a 的最高索引是 10,所以当 i 是 11 时,除非你激活了范围检查,否则当你写入 a[11] (i =11) 你会覆盖其他东西。这是在局部变量区域中,因此它可能是 i,例如,甚至是您看不到的内部变量,例如用于 for 循环的限制,它是在循环开始时计算的。一旦允许这种情况发生,几乎一切皆有可能。

当然,问题的确切表现会因编译器的一个版本而异。在一个版本中,您可能会侥幸逃脱。在另一个你不会。