Код:
TYPE
List* = POINTER TO RECORD (O.Object)
FCount,
FCapacity: INTEGER;
FList: POINTER TO ARRAY OF O.Object;
END;
ListSortCompare* = PROCEDURE (Index1, Index2: INTEGER): INTEGER;
ListSortExchange* = PROCEDURE (Index1, Index2: INTEGER);
ListSort* = PROCEDURE (l, r: INTEGER; Compare: ListSortCompare; Exchange: ListSortExchange);
PROCEDURE QuickSort (
L, R : INTEGER;
Compare: ListSortCompare;
Exchange: ListSortExchange);
VAR
I, J: INTEGER;
P, Q: INTEGER;
BEGIN
REPEAT
I := L;
J := R;
P := (L + R) DIV 2;
REPEAT
WHILE Compare (P, I) > 0 DO INC(I) END;
WHILE Compare (P, J) < 0 DO DEC(J) END;
IF I <= J THEN
Exchange (I, J);
INC(I);
DEC(J)
END;
UNTIL I > J;
IF L < J THEN QuickSort (L, J, Compare, Exchange) END;
L := I;
UNTIL I >= R;
END QuickSort;
PROCEDURE (L: List) Sort*(sortList: ListSort; Compare: ListSortCompare), NEW;
BEGIN
sortList (0, L.FCount - 1, Compare, L.Exchange)
END Sort;
В строке
sortList (0, L.FCount - 1, Compare,
L.Exchange)
показывает сообщение о несовместимости типов.
Тобишь, L.Exchange не тождественен типу ListSortExchange. Или, иными словами,
PROCEDURE (L: List) Exchange* (Index1, Index2: INTEGER)
и
PROCEDURE (Index1, Index2: INTEGER)
разные типы.
Каким же образом я могу представить процедурный тип иначе, чтобы я мог подставить его в sortList?