此代码段不仅会导致运行时错误,如果我使用调试器运行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(虽然不在调试模式下)吐出超出范围的错误,但在我看来,我看到我试图读取的变量存在。任何帮助都非常感谢!
答案 0 :(得分:1)
rAux:trplayers;
您输入了错误的符号,或者此处的类型名称中是否包含“r”?
答案 1 :(得分:1)
看起来有效(除了错别字)...所以让我们尝试一些简单的事情 你中止时“j”的价值是多少? 如果调试器不会告诉您,请尝试添加:
writeln ('j = ', j);
就在“交换”电话之前。
正如Yochai的问题暗示的那样,你的阵列需要至少从尺寸上确定 1(或更低)到MAXPLAYERS(或更大)。 (即:0..MAXPLAYERS-1不起作用, 但是1..MAXPLAYERS应该。)