OberonCore https://forum.oberoncore.ru/ |
|
Помогите разобраться с примером ObxDb https://forum.oberoncore.ru/viewtopic.php?f=35&t=2822 |
Страница 1 из 1 |
Автор: | Xanmark3 [ Среда, 01 Сентябрь, 2010 22:18 ] |
Заголовок сообщения: | Помогите разобраться с примером ObxDb |
Здравствуйте! Вот пример: Код: 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 (с того места куда нужно вставить часть записи). Чувствую, что все это как-то связано с указательным типом. Но в "сообщении о языке" об этом сыро написано и... Во общем помогите пожалуйста. А то неделю бьюсь над этим примером и дальше разбираться не пойду пока с этим не разберусь. ![]() |
Автор: | Info21 [ Среда, 01 Сентябрь, 2010 22:47 ] |
Заголовок сообщения: | Re: Помогите разобраться с примером ObxDb |
Лучше начать с учебника, Вирт, "Алгоритмы...", ссылка вот тут: http://www.inr.ac.ru/~info21/literatura.htm Глава 4. На диске есть работающие примеры, с которыми можно поиграть. Примеры можно скачать отдельно -- см. ссылку "Доп. информация" на страничке "Литература". --------------- Похоже, надо комментарии в примерах Obx тоже на русский перевести. |
Автор: | Xanmark3 [ Четверг, 02 Сентябрь, 2010 10:02 ] |
Заголовок сообщения: | Re: Помогите разобраться с примером ObxDb |
Спасибо за ссылки. Комментарии не надо переводить. И так ясно что там написано. Но непонятно как это понимать. Например: (* insert between p and h *) Присвоение записи n полю next записи р. А как это р вставляется в List? |
Автор: | Info21 [ Четверг, 02 Сентябрь, 2010 10:57 ] |
Заголовок сообщения: | Re: Помогите разобраться с примером ObxDb |
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 пробегает по элементам списка в предыдущем цикле, со связями элементов списка ничего не делается, элементы остаются связанными в список. |
Автор: | Xanmark3 [ Воскресенье, 05 Сентябрь, 2010 11:16 ] |
Заголовок сообщения: | Re: Помогите разобраться с примером ObxDb |
Спасибо! Теперь разобрался. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |