【问题标题】:Weird runtime error while implementing a bubble sort in Pascal在 Pascal 中实现冒泡排序时出现奇怪的运行时错误
【发布时间】:2011-05-19 04:05:31
【问题描述】:

这个 sn-p 不仅会导致运行时错误,如果我使用调试器运行它,它还会关闭 FPC。

procedure sortplayersbyscore(var vAux:tplayers);

    procedure swap(var a:trplayers;var b:trplayers);

    var
        rAux:trplayers;

    begin
        rAux:=a;
        a:=b;
        b:=rAux;
    end;

var
    i,j:integer;
    sorted:boolean;

begin
    vAux:=playersarray;
    i:=1;
    sorted:=false;
    while (i <= MAXPLAYERS -1) and not sorted do
    begin
        j:=1;
        sorted:=true;
        while (j <= MAXPLAYERS -i) do
        begin
            if (vAux[j].score < vAux[j+1].score) then
            begin
                swap(vAux[j],vAux[j+1]);
                sorted:=false;
            end;
            inc(j);
        end;
        inc(i);
    end;
end;

代码本身是一个非常大的源文件的一部分,我可以发布整个内容,但导致错误的只是那一堆行。调试器在以下行终止:

swap(vAux[j],vAux[j+1]);

tplayers 只是一种定义为记录数组的类型,其中包含一堆其他变量中的分数(整数)。 tplayers 是上述记录的类型。我完全不知所措; FPC(虽然不在调试模式下)吐出一个超出范围的错误,但在我的观察下,我看到我试图读取的变量存在。非常感谢任何帮助!

【问题讨论】:

  • 首先,数组声明在哪里?其次,如果您将 vAux 作为输入,为什么要在开始时执行 vAux:=tplayers;
  • @Yochai:很抱歉,我的原始代码是西班牙语,所以我想我最好翻译一些变量并将其弄混。该数组被声明为 tplayers=array[1..MAXPLAYERS] of tplayers。 tplayers 只是一个包含一些整数值的记录,例如分数。
  • 请发布您的实际代码,无需担心翻译。变量名并不重要,尝试将其更改为在此处发布通常会引入错误(例如此处发生的情况),从而更改或隐藏实际问题。
  • 更好,一个演示问题的最小可运行程序。

标签: pascal freepascal


【解决方案1】:

rAux:trplayers;是你输入了错误的符号还是这里的类型名称中确实包含“r”?

【讨论】:

  • 不,没错,是记录; tvplayers 是一个 trplayers 数组。
  • procedure swap(var a:tplayers;var b:tplayers); rAux:trplayers; rAux:=a; 您显然应该在编译期间出现类型不匹配错误。我在您的代码中没有找到tvplayers。这里是你真正执行的代码吗?请再看一遍。
  • 你说得对,我将类型和变量名翻译成英文,这样更容易理解。 a 和 b 是 trplayers。
【解决方案2】:

它看起来有效(除了拼写错误)......所以让我们尝试一些简单的东西。
中止时“j”的值是多少? 如果调试器不告诉你,请尝试添加:

writeln ('j = ', j);

就在“交换”调用之前。

正如 Yochai 的问题所暗示的,您的数组至少需要从 1(或更低)到 MAXPLAYERS(或更大)。 (即:0..MAXPLAYERS-1 不起作用, 但是 1..MAXPLAYERS 应该。)

【讨论】:

  • 数组下标是正确的,因为循环使用了vAux[j]vAux[j + 1]。您必须将其限制为 MAXPLAYERS - 1,否则第二个条件 (vAux[j + 1]) 将超出数组的末尾。
  • 在帖子的 cmets 中,OP 指定了数组 1..MAXPLAYERS 的范围,所以这不是问题。我同意 Stan 的观点,即在异常之前查看索引是解决问题的线索
猜你喜欢
  • 1970-01-01
  • 2020-04-19
  • 2011-02-17
  • 2018-01-29
  • 2012-07-23
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多