OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 13:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: Воскресенье, 07 Март, 2010 21:25 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Код:

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?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Март, 2010 21:37 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Роман М. писал(а):
PROCEDURE (L: List) Exchange* (Index1, Index2: INTEGER)
и
PROCEDURE (Index1, Index2: INTEGER)
разные типы.
Естественно, списки параметров ведь разные.
Роман М. писал(а):
Каким же образом я могу представить процедурный тип иначе, чтобы я мог подставить его в sortList?
Убрать параметр (L: List) либо внести его в основной список параметров: PROCEDURE Exchange* (L: List; Index1, Index2: INTEGER)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Март, 2010 21:39 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Убрать я не могу - ведь это метод, расширяющий запись.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Март, 2010 22:41 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Роман М. писал(а):
Убрать я не могу - ведь это метод, расширяющий запись.
Тогда дурацкий вопрос вам: зачем вам И переопределяемый метод, И параметр в методе Sort (который, кстати, тоже переопределяемый)?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Март, 2010 22:53 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Дело в том, что я решил отступиться от метода быстрой сортировки, оставив только процедуру сравнения двух ячеек списка и процедуру обмена ячеек, чтобы можно было опробовать другой метод сортировки.
Обмен ячеек выполняется "встроенным" методом списка, а вот сравнение ячеек - неявно, поэтому должно производиться внешней процедурой.
Вот такие у меня соображения.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Март, 2010 22:56 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Цитата:
В строке
sortList (0, L.FCount - 1, Compare, L.Exchange)
показывает сообщение о несовместимости типов.
Тобишь, L.Exchange не тождественен типу ListSortExchange. Или, иными словами,
PROCEDURE (L: List) Exchange* (Index1, Index2: INTEGER)
и
PROCEDURE (Index1, Index2: INTEGER)
разные типы.

Ну дык это и в С++ тип метода не совпадает с типом функции с теми же параметрами. Только там этого не видно, а здесь налицо явный параметр.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 07 Март, 2010 23:25 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Валерий Лаптев писал(а):
Только там этого не видно, а здесь налицо явный параметр.

Я мог бы использовать L.Exchange в процедуре QuickSort, если бы она являлась методом List.

Решил таки внести QuickSort как скрытый метод списка, который при желании можно переопределить другой функцией сортировки.
Код:
   PROCEDURE (L: List) QuickSort (
         l, r : INTEGER;
         Compare: ListSortCompare), NEW;
      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
               L.Exchange (i, j);
               INC(i);
               DEC(j)
            END;
         UNTIL i > j;
         IF i < j THEN L.QuickSort (l, j, Compare) END;
         l := i;
      UNTIL i >= r;
   END QuickSort;
   
   PROCEDURE (L: List) Sort*(Compare: ListSortCompare), NEW, EXTENSIBLE;
   BEGIN
      L.QuickSort (0, L.FCount - 1, Compare)
   END Sort;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Март, 2010 09:45 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
В С++ вопрос совместимости типов функций и методов решается написанием оберток-функкторов вокруг указателей. У меня в книжке по ООП есть раздел "Как написать обобщенный алгоритм", где я достаточно подробно этот вопрос обсуждаю. Интересно, как это решить в КП?
Кстати, в stlном списке сортировка тоже собственная, реализована как метод класса list.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Март, 2010 12:02 

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
Александр Ильин писал(а):
Тогда дурацкий вопрос вам: зачем вам И переопределяемый метод, И параметр в методе Sort (который, кстати, тоже переопределяемый)?

У меня в голове сразу возникает куча, не менее дурацких - ответов
1) в задаче могут быть много разных списков. Например, столбцы некой матрицы. И каждый сортируется по своему критерию: числовой прядок, текстовый, как дата, и т.п..
2) таких "матриц" может быть несколько. Т.е., превращение метода в просто_функцию - не всегда в тему.

Про замену процедурного типа на абстрактный объект приемник_сообщений - я знаю.
Наслушался уже.
Просто function of object - выглядело бы гораздо естественней. И эффективнее


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB