OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 01 Сентябрь, 2010 22:18 

Зарегистрирован: Среда, 01 Сентябрь, 2010 21:17
Сообщения: 3
Здравствуйте! Вот пример:

Код:
MODULE ObxDb;

IMPORT Views, TextModels, TextMappers, TextViews, TextControllers;

   CONST
      int = TextMappers.int; string = TextMappers.string; real = TextMappers.real; invalid = TextMappers.invalid;

   TYPE
      Node = POINTER TO RECORD
         next: Node;
         id: INTEGER;
         name: TextMappers.String;
         value: REAL
      END;

   VAR list: Node;

   PROCEDURE Enter (id: INTEGER; name: TextMappers.String; value: REAL);
      VAR n, h, p: Node;
   BEGIN   (* insert a new tuple into the list at its correct position *)
      NEW(n); n.id := id; n.name := name; n.value := value;
      h := list; p := NIL; WHILE (h # NIL) & (h.id <= id) DO p := h; h := h.next END;
      IF p # NIL THEN   (* insert between p and h *)
         p.next := n
      ELSE   (* insert at beginning *)
         list := n
      END;
      n.next := h
   END Enter;

   PROCEDURE EnterData*;
      VAR c: TextControllers.Controller; beg, end: INTEGER;
         s: TextMappers.Scanner; id: INTEGER;
         name: TextMappers.String; value: REAL;
   BEGIN   (* read a text selection and split it into an integer, string, and real field *)
      c := TextControllers.Focus();
      IF (c # NIL) & c.HasSelection() THEN
         c.GetSelection(beg, end);
         s.ConnectTo(c.text); s.SetPos(beg);
         s.Scan;
         WHILE (s.type = TextMappers.int) & (s.Pos() <= end) DO
            IF s.type = int THEN id := s.int; s.Scan ELSE s.type := TextMappers.invalid END;
            IF s.type = string THEN name := s.string; s.Scan ELSE s.type := invalid END;
            IF s.type = real THEN value := SHORT(s.real); s.Scan ELSE s.type := invalid END;
            Enter(id, name, value)   (* enter the new tuple into a global list *)
         END;
         c.SelectAll(FALSE)
      END
   END EnterData;

   . . . . . . . . . . . . .


END ObxDb.


Полную версию модуля смотрите в BB.

Вопрос касается процедуры Enter.
Не могу понять каким образом в запись List вставляется запись р. Ведь записи List идет присвоение только в единственном случае - если она NIL.
И непонятно как определяется куда вставить р ведь она содержит только "отрезанную и обновленную" запись List (с того места куда нужно вставить часть записи).

Чувствую, что все это как-то связано с указательным типом. Но в "сообщении о языке" об этом сыро написано и... Во общем помогите пожалуйста. А то неделю бьюсь над этим примером и дальше разбираться не пойду пока с этим не разберусь. :?


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Лучше начать с учебника, Вирт, "Алгоритмы...", ссылка вот тут:
http://www.inr.ac.ru/~info21/literatura.htm
Глава 4.
На диске есть работающие примеры, с которыми можно поиграть.
Примеры можно скачать отдельно -- см. ссылку "Доп. информация" на страничке "Литература".

---------------
Похоже, надо комментарии в примерах Obx тоже на русский перевести.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Сентябрь, 2010 10:02 

Зарегистрирован: Среда, 01 Сентябрь, 2010 21:17
Сообщения: 3
Спасибо за ссылки.

Комментарии не надо переводить. И так ясно что там написано. Но непонятно как это понимать.
Например:
(* insert between p and h *)
Присвоение записи n полю next записи р. А как это р вставляется в List?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 02 Сентябрь, 2010 10:57 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Xanmark3 писал(а):
(* insert between p and h *)
Присвоение записи n полю next записи р. А как это р вставляется в List?

Если речь об этом:

IF p # NIL THEN (* insert between p and h *)
p.next := n

то p уже вставлено в список.
p сначала было равно NIL, потом list, потом list.next, ...
p просто последовательно указывает на элементы в списке.
Когда p пробегает по элементам списка в предыдущем цикле, со связями элементов списка ничего не делается, элементы остаются связанными в список.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 05 Сентябрь, 2010 11:16 

Зарегистрирован: Среда, 01 Сентябрь, 2010 21:17
Сообщения: 3
Спасибо! Теперь разобрался.


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

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


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

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


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

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