在Pascal中实现冒泡排序时出现奇怪的运行时错误

时间:2011-05-19 04:05:31

标签: pascal freepascal

此代码段不仅会导致运行时错误,如果我使用调试器运行FPC,它会使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只是一种定义为记录数组的类型,其中包含一堆其他变量中的得分(整数)。 trplayers是上述记录的类型。我完全失去了; FPC(虽然不在调试模式下)吐出超出范围的错误,但在我看来,我看到我试图读取的变量存在。任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:1)

rAux:trplayers;您输入了错误的符号,或者此处的类型名称中是否包含“r”?

答案 1 :(得分:1)

看起来有效(除了错别字)...所以让我们尝试一些简单的事情 你中止时“j”的价值是多少? 如果调试器不会告诉您,请尝试添加:

writeln ('j = ', j);

就在“交换”电话之前。

正如Yochai的问题暗示的那样,你的阵列需要至少从尺寸上确定 1(或更低)到MAXPLAYERS(或更大)。 (即:0..MAXPLAYERS-1不起作用, 但是1..MAXPLAYERS应该。)