【问题标题】:program stops after reading procedure (delphi)程序在读取程序后停止(delphi)
【发布时间】:2015-04-12 21:18:25
【问题描述】:

我的程序停止读取更多行并在此过程之后结束程序,就像它的“结束”一样。在它之后(但不是):

  Procedure BubbleSort;
  var i, j : integer;
  begin
    for i := 0 to count - 1 do begin
      for j := count - 1 downto i do
        if (together[j] > together[j - 1]) then
          Swap(together[j - 1], together[j]);
    end;
  end;

【问题讨论】:

  • count是什么,它有什么价值?
  • 我不太清楚,但很多……可能是 50 个
  • 别猜了!在第一个forloop 上放一个断点,让调试器告诉你。
  • 数值正好是28
  • 当你在断点后按 F8 单步执行代码时会发生什么。

标签: delphi pascal bubble-sort


【解决方案1】:

我猜问题是数组访问越界。您访问索引-1。通过将外部循环更改为:

for i := 1 to count - 1 do begin

我建议您启用范围检查,以便您可以通过信息性运行时错误了解越界数组访问。

【讨论】:

  • 非常感谢......但我真的不明白你在那里写了什么......你能给我解释一下吗?
  • 当 i 为 0 时,j 循环的结尾为 0。因此您访问索引 j-1。也就是说,你可以算一算。
  • 糟糕 - 输入速度太慢...看来我可以编辑我的 cmets 但无法删除它们。如果在外循环开始时 i 为 0,则在内循环结束时 j 将设置为 i-1 = -1。当您尝试一起访问时会发生什么[-1]?
  • @Filip 您在项目选项/编译器中设置了 范围检查溢出检查(具体菜单项因 Delphi 版本而异)。它们应该始终处于打开状态,以便您在它们发生的时间和地点得到实际的错误(而不是稍后的相关错误)。没有多少程序需要或必须关闭这些选项。
  • @JanDoggen 我什至可以说任何程序都不应该关闭这些选项。我有一些应用程序通过禁用范围检查获得了重要的性能,但是当我这样做时,它总是在本地使用编译器指令,并且只围绕那些处于性能瓶颈的方法。像这样的东西:stackoverflow.com/a/4998442/327083,但总是以{$IFNDEF DEBUG} 为条件,这样如果事情发生变化,在任何开发过程中都会发现错误。
猜你喜欢
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2010-10-02
相关资源
最近更新 更多