OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 16:08

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: POINTER TO ANYREC
СообщениеДобавлено: Понедельник, 24 Июль, 2006 00:14 

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Доброго времени суток, господа.
У меня ест ьтакой вопрос: я создал процедуру добавления элемента в начало списка.
Код:
PROCEDURE AddToList (VAR head: ANYPTR; elem: ANYPTR);
BEGIN
   WITH head : PFodder DO
         WITH elem: PFodder DO
            elem.next := head;
            head := elem;      
         END;
      |   head: PMineralSubstance DO
         WITH elem: PMineralSubstance DO
            elem.next := head;
            head := elem;      
         END;
      END;      
END AddToList;


Так вот. В коде программы я пишу:
Код:
AddToList(head,p);


head и p в данном случае - PFodder.
Как мне думается, если Fodder является потомком ANYREC, то все должно быть хорошо. А на самом деле возникает ошибка несоответствия типов параметров - фактического и формального. Я подозреваю что это связано с тегами, но в данном случае не очень понятно, можно ли этого избежать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: POINTER TO ANYREC
СообщениеДобавлено: Понедельник, 24 Июль, 2006 09:45 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Если процедура объявлена так:
PROCEDURE AddToList (VAR head: ANYPTR; elem: ANYPTR);
то и передавать в качестве VAR параметра Вы должны именно ANYPTR.
Код:
VAR head, elem: PFodder;
  pointer: ANYPTR;
BEGIN
  ...
  pointer := head;
  AddToList(pointer, elem);
  head := pointer(PFodder);

Но тогда смысла в такой процедуре становится маловато.

Ну, попробуйте её оформить как функцию (без VAR параметров), как-нибудь так:

list := Attach(list, element)(PFodder);

А ещё лучше, не поленитесь и напишите типизированные варианты процедур.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: POINTER TO ANYREC
СообщениеДобавлено: Понедельник, 24 Июль, 2006 11:50 

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:43
Сообщения: 14
Откуда: Россия, Орёл
Сергей Губанов писал(а):
А ещё лучше, не поленитесь и напишите типизированные варианты процедур.


Как раз это я и написал, но это мне не нравится :(, поскольку надо писать для каждого типа свою процедуру. Хорошо, что здесь только две операции. А если бы их было 50, 10? Как бы мой код увеличился...
Да, видимо, сделаю функцию... Хотя хочется сделать процедуру. Ну джа ладно. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: POINTER TO ANYREC
СообщениеДобавлено: Понедельник, 24 Июль, 2006 14:23 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Евгений Семашко писал(а):
Хорошо, что здесь только две операции. А если бы их было 50, 10? Как бы мой код увеличился...


Ой, да ладно... :D

---

Я односвязными списками обычно так пользуюсь:
Код:
TYPE
  List = POINTER TO RECORD
    head: Head;
    tail: List
  END;

  PROCEDURE NewList (head: Head; tail: List): List;
    VAR list: List;
  BEGIN NEW(list); list.head := head; list.tail := tail;
    RETURN list
  END NewList;

  ...
  list := NewList(head, list); (* добавить элемент в начало списка *)
  ...

где тип Head - для каждого типа списка свой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 25 Июль, 2006 00:22 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Почему не использовать такой вариант
Код:
   TYPE
      ListItem = POINTER TO RECORD
         next: ListItem
      END;

   PROCEDURE AddToList (VAR head: ListItem; List: ListItem);
   BEGIN
      elem.next := head;
                head := elem;     
   END AddToList;

и не наследовать свои типы от ListItem?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 25 Июль, 2006 00:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А вообще "ради удобства" никакой нужды скрывать две операции с указателем за процедурой нет.
Если же речь идет об инкапсулсуляции, т.е. указатели скрыты, то тогда надо вводить тип-контейнер, который хранит список внутри себя и с ним работает.


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

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


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

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


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

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