Странная ошибка времени выполнения при реализации пузырьковой сортировки в Паскале

Этот фрагмент не только вызывает ошибку времени выполнения, но и закрывает 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 (пока не в режиме отладки) выдает ошибку вне диапазона, но под моими часами я вижу, что переменные, которые я пытаюсь прочитать, существуют. Любая помощь очень ценится!


person Fernando Martin    schedule 19.05.2011    source источник
comment
Прежде всего, где объявление массива? во-вторых, если вы получаете vAux в качестве входных данных, почему вы делаете vAux:=tplayers; в начале?   -  person Yochai Timmer    schedule 19.05.2011
comment
@Yochai: Извините за это, мой исходный код на испанском языке, поэтому я подумал, что мне лучше перевести некоторые переменные, и я перепутал. Массив объявлен как tplayers=array[1..MAXPLAYERS] trplayers. trplayers — это просто запись, содержащая некоторые целочисленные значения, такие как счет.   -  person Fernando Martin    schedule 19.05.2011
comment
Пожалуйста, опубликуйте свой реальный код, не беспокоясь о переводе. Имена переменных не должны иметь особого значения, и попытка изменить их, чтобы опубликовать здесь, часто приводит к ошибкам (например, то, что произошло здесь), которые изменяют или скрывают реальную проблему.   -  person Ken White    schedule 21.05.2011
comment
Лучше, минимальная работающая программа, которая демонстрирует проблему.   -  person Marco van de Voort    schedule 21.05.2011


Ответы (2)


rAux:trplayers; Вы ввели неверный символ или тип здесь действительно содержит "r" в своем названии?

person Pehat    schedule 19.05.2011
comment
Нет, верно, это рекорд; tvplayers — это массив trplayers. - person Fernando Martin; 20.05.2011
comment
procedure swap(var a:tplayers;var b:tplayers); rAux:trplayers; rAux:=a; У вас явно должна быть ошибка несоответствия типов во время компиляции. Я не нашел tvplayers в вашем коде. Здесь код, который вы действительно выполняете? Проверьте еще раз, пожалуйста. - person Pehat; 20.05.2011
comment
Вы правы, я перевел типы и имена переменных на английский язык, чтобы их было легче понять. a и b - trplayers. - person Fernando Martin; 21.05.2011

Это выглядит корректно (кроме опечаток)... так что давайте попробуем что-нибудь простое.
Каково значение "j" при прерывании? Если отладчик не сообщит вам, попробуйте добавить:

writeln ('j = ', j);

непосредственно перед вызовом «своп».

Как подразумевал вопрос Йохая, размер вашего массива должен быть как минимум от 1 (или ниже) до MAXPLAYERS (или больше). (То есть: 0..MAXPLAYERS-1 не будет работать, а 1..MAXPLAYERS должно.)

person Stan Sieler    schedule 20.05.2011
comment
Индексы массива верны, так как цикл использует vAux[j] и vAux[j + 1]. Вы должны ограничить его значением MAXPLAYERS - 1, иначе второе условие (vAux[j + 1]) выйдет за пределы массива. - person Ken White; 21.05.2011
comment
В комментариях к сообщению ОП указывает диапазон массива 1..MAXPLAYERS, так что это не проблема. Я согласен со Стэном в том, что поиск индексов непосредственно перед исключением является ключом к решению. - person Marco van de Voort; 21.05.2011