【问题标题】:Unknown Runtime Error in delphi7, 'Invalid floating point operation.' No crashdelphi7中的未知运行时错误,“无效的浮点运算。”没有崩溃
【发布时间】:2018-04-14 10:34:37
【问题描述】:

您好,我需要有关我编写的一段代码的建议。这是我的 delphi7 学校教科书中的一项活动,所以你可以想象我对帕斯卡还是新手。 我的程序运行良好并获得了我需要的结果,但我收到了一个奇怪的消息: 运行时出现“无效的浮点运算”消息,而不会导致程序崩溃。以我有限的知识,我找不到这个错误背后的原因。这很令人困惑,因为我没有使用任何实数,但请看一下。 如果您需要更多信息,请告诉我 提前谢谢你,我愿意学习!

   private
    arrLearners : array of string;
    arrMod : array of string;   
procedure TfrmPortfolios.btnEnterClick(Sender: TObject);
var
numL,k,d,a : integer;
l :string;
begin
  k:=0;
  numL:=0;

  repeat
   numL := StrToInt(InputBox('Enter names','How many learners in Subject?
   (Max 30):','30'));
   until
   numL<=30;
 SetLength(arrLearners, numL);

 for k:=0 to numL-1 do
   begin
        arrLearners[k]:='Student No'+IntToStr(k+1);
   end;

 k:=0;
 d := numL div 5; //used to see for every which learner will go to moderation. I.e if d=3 then every third student.
 if numL <=9 then // below 9, d=1 then it's every student anyways
    begin
         for k:=0 to NumL-1 do
            begin
                 SetLength(arrMod,NumL);
                 arrMod[k]:=arrLearners[k];
            end;
    end
    else
      begin
           a := numL div d;
           SetLength(arrMod, a);
           for k:=0 to a-1 do
               begin

                    arrMod[k] := arrLearners[(k*d) +1];
               end;
       end;

 k:=0;
 redOutput.Lines.Add('Students sent for moderation:'+#13);
 for k:=0 to numL-1 do
   begin
        l:= arrMod[k];
        redOutput.Lines.Add(l);
   end;

end;

【问题讨论】:

  • 我注意到我的结果有误,但我修复了它,但仍然出现浮动错误:arrMod[k] := arrLearners[(k*d)+d-1 ];
  • 如果您从 Delphi 7 IDE 运行,它是否会在消息后将您弹出到代码中的特定位置?您显示的代码中没有任何显式浮点值或操作,因此问题可能出在其他地方。
  • FWIW,有一些有用的链接向人们展示了如何调试。这是一个:Delphi debugging for dummies,这是另一个:Debug faster, Debug smarter 都来自不同的 CodeRage 事件。
  • 请注意,当numL 大于9 时,arrMod 的大小为numL div d。 (即numL div 5)。所以它小于numL。但是,在最后几行中,您正在从 0..numL-1 查找 arrMod 的值 - 因此您正在尝试访问高于数组实际大小的成员。这可能导致意外行为(“越界”问题)

标签: delphi runtime-error delphi-7 pascal


【解决方案1】:

确保您已启用范围检查和溢出检查选项。您可以使用编译器指令在代码中全局或本地启用它们 {$R+,O+} 范围检查是一件非常有用的事情 - 它可以为您节省大量调试奇怪问题的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多