Я не понимаю, почему изменился мой вывод, пожалуйста, помогите мне

#arrays #quicksort #freepascal

Вопрос:

Я использую Free Pascal для создания функции сортировки массива целых чисел под названием QuickSort, которая использует алгоритм быстрой сортировки. Вот моя программа:

 uses crt;
var
        i,n : integer;
        A : array[1..100] of integer;

procedure QuickSort(var arr : array of integer; l,r : integer);
var
        i,j,y,x : integer;

begin
        i := l; j := r;
        x := arr[(l r) div 2];
        repeat
                while arr[i] < x do inc(i);
                while x < arr[j] do dec(j);
                if i <= j then
                begin
                        y := arr[i]; arr[i] := arr[j]; arr[j] := y;
                        inc(i); dec(j);
                end;
        until i > j;
        if l < j then QuickSort(arr,l,j);
        if i < r then QuickSort(arr,i,r);
end;

BEGIN
        readln(n);
        for i := 1 to n do
        begin
                write('A[',i,'] = ');
                readln(A[i]);
        end;
        QuickSort(A,1,n);
        for i := 1 to n do write(A[i]:7);
        readln;
END.
 

Каким бы ни был мой вклад, он не работает. Но когда я изменю это

 var
        i,n : integer;
        A : array[1..100] of integer;

procedure QuickSort(var arr : array of integer; l,r : integer);
 

в это

 type
        Array_ = array[1..100] of integer;
var
        i,n : integer;
        A : Array_;

procedure QuickSort(var arr : Array_; l,r : integer);
 

это работает идеально. Кто-нибудь может мне это объяснить? Спасибо вам :))

Комментарии:

1. Интересно, каких «дополнительных деталей» не хватает близкому избирателю?

Ответ №1:

Когда вы объявляете функцию как

 procedure QuickSort(var arr : array of integer; l,r : integer);
 

вы объявляете массив как «параметр открытого массива», и применяются некоторые специальные правила. «Параметр открытого массива» позволяет передавать функции массивы разного размера. Однако для того, чтобы это работало правильно, необходимо соблюдать некоторые правила, из которых вы не следовали этому:

В теле подпрограммы индексирование начинается с 0 (независимо от того, как был определен переданный массив). Вы можете использовать Low и High для изучения диапазона индексов, который также может быть выражен как 0..Длина-1.