0

このスニペットは実行時エラーを引き起こすだけでなく、デバッガーを使用して実行すると 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 (デバッグ モードではない場合) は範囲外エラーを吐き出しますが、ウォッチの下では、読み込もうとしている変数が存在することがわかります。どんな助けでも本当に感謝しています!

4

2 に答える 2

1

有効に見えます (タイプミス以外) ... 簡単なことを試してみましょう。
中止するときの「j」の値は? デバッガーが教えてくれない場合は、以下を追加してみてください:

writeln ('j = ', j);

「スワップ」コールの直前。

Yochai の質問が示唆しているように、配列は少なくとも 1 (またはそれ以下) から MAXPLAYERS (またはそれ以上) までの次元にする必要があります。(つまり: 0..MAXPLAYERS-1 は機能しませんが、1..MAXPLAYERS は機能するはずです。)

于 2011-05-20T21:34:52.187 に答える
1

rAux:trplayers;間違った記号を入力したか、ここにある型の名前に「r」が本当に含まれていますか?

于 2011-05-19T19:25:49.810 に答える