OberonCore
https://forum.oberoncore.ru/

Помогите разобраться как грамотно пользоваться трапом.
https://forum.oberoncore.ru/viewtopic.php?f=81&t=3042
Страница 1 из 2

Автор:  Хохулин Олег [ Пятница, 03 Декабрь, 2010 08:05 ]
Заголовок сообщения:  Помогите разобраться как грамотно пользоваться трапом.

сделал пример из 4-х простеньких модулей:
Код:
МОДУЛЬ ПримерЖивность;
   ТИП
      Описание* = УКАЗАТЕЛЬ ДО МАССИВ ИЗ  ЛИТЕР;
      
      Живность* = УКАЗАТЕЛЬ ДО АБСТРАКТНАЯ ЗАПИСЬ
         имя*: Описание; (*Описание;*)
         описание*: Описание;
      КОНЕЦ;

ПРОЦЕДУРА (эта_живность:Живность) описать*(): Описание, НОВЫЙ ;
   ПЕРЕМЕННЫЕ
   описание: Описание;
НАЧАЛО
   НОВЫЙ (описание, 40);
   описание^:= эта_живность.имя + эта_живность.описание;
   ВЕРНУТЬ описание;
КОНЕЦ описать;   

КОНЕЦ ПримерЖивность.

Код:
МОДУЛЬ ПримерЗверь;
   ПОДКЛЮЧИТЬ  ПримерЖивность;
   ТИП
   
      Зверь* = УКАЗАТЕЛЬ ДО ЗАПИСЬ (ПримерЖивность.Живность)
      КОНЕЦ;   
(*   ПРОЦЕДУРА новый_зверь*( наименование: ПримерЖивность.Описание): Зверь; *)
ПРОЦЕДУРА новый_зверь*( наименование: МАССИВ ИЗ  ЛИТЕР): Зверь;
   ПЕРЕМЕННЫЕ
         этот_зверь: Зверь;
   НАЧАЛО
      НОВЫЙ (этот_зверь);
      этот_зверь.описание^:= "бегает";
      этот_зверь.имя^ := наименование$;
      ВЕРНУТЬ этот_зверь;   
   КОНЕЦ новый_зверь;
   
НАЧАЛО
КОНЕЦ  ПримерЗверь.

Код:
МОДУЛЬ ПримерПтица;
   ПОДКЛЮЧИТЬ  Вывод := i21eduВывод, ПримерЖивность;
   ТИП
      Птица* = УКАЗАТЕЛЬ ДО ЗАПИСЬ (ПримерЖивность.Живность)
      КОНЕЦ;   
ПРОЦЕДУРА новая_птица*( наименование: МАССИВ ИЗ  ЛИТЕР): Птица;
   ПЕРЕМЕННЫЕ
      эта_птица: Птица;
   НАЧАЛО
      Вывод.Цепочка( "отметка-1" );
      НОВАЯ (эта_птица);
      эта_птица.описание^:= "летает";
      эта_птица.имя^ := наименование$;
      ВЕРНУТЬ эта_птица;   
   КОНЕЦ новая_птица;

Код:
МОДУЛЬ Пример;
   ПОДКЛЮЧИТЬ  Вывод := i21eduВывод,
      ПримерЖивность, ПримерПтица, ПримерЗверь;
   КОНСТАНТЫ
      количество_живности = 4;  (*пусть будут ворона, собака, лиса, ястреб*)
   ПЕРЕМЕННЫЕ
      список_живности : УКАЗАТЕЛЬ ДО МАССИВ ИЗ ПримерЖивность.Живность;
      i : INTEGER;
      текст: УКАЗАТЕЛЬ ДО МАССИВ ИЗ ЛИТЕР;
   
ПРОЦЕДУРА описать_живность*();
  ПЕРЕМЕННЫЕ
  НАЧАЛО
   НОВЫЙ (список_живности, количество_живности + 1);
   Вывод.Цепочка( "отметка-0");
   список_живности [0]:= ПримерПтица.новая_птица("Ворона");
   список_живности [1]:= ПримерЗверь.новый_зверь("Собака");   
   список_живности [2]:= ПримерЗверь.новый_зверь("Лиса");   
   список_живности [3]:= ПримерПтица.новая_птица("Ястреб");
   ДЛЯ i :=0  ДО количество_живности-1 ДЕЛАТЬ
         текст:=список_живности[i].описать();
         Вывод.Цепочка( текст ); Вывод.НовСтрока;
   КОНЕЦ;   
   список_живности:= ОТСУТСТВУЕТ;
   КОНЕЦ описать_живность;

НАЧАЛО
   
КОНЕЦ Пример.



Запускаю Пример.описать_живность()
получаю трап: NIL dereference (read)
понимаю
в "отметку-0" попадает
в "отметку-1" ― нет
1)Помогите разобраться - почему?
2)Помогите разобраться как грамотно пользоваться трапом. Для меня это ― по сути артефакт.

сам трап:
Код:
NIL dereference (read)

 ПримерПтица.новая_птица   [0000005EH]
   .наименование   ARRAY 7 OF CHAR   "Ворона"
   .эта_птица   ПримерПтица.Птица   [0101C090H]
 Пример.описать_живность   [0000003FH]
 StdInterpreter.CallProc   [000003A5H]
   .a   BOOLEAN   FALSE
   .b   BOOLEAN   FALSE
   .c   BOOLEAN   FALSE
   .i   Meta.Item   поля
   .imported   ARRAY 256 OF CHAR   ""   ...
   .importing   ARRAY 256 OF CHAR   ""   ...
   .mn   Meta.Name   "Пример"
   .mod   StdInterpreter.Ident   "Пример"
   .object   ARRAY 256 OF CHAR   ""   ...
   .ok   BOOLEAN   TRUE
   .parType   INTEGER   0
   .pn   Meta.Name   "описать_живность"
   .proc   StdInterpreter.Ident   "описать_живность"
   .res   INTEGER   0
   .v   StdInterpreter.ProcVal   поля
   .vi   StdInterpreter.ProcIVal   поля
   .vii   StdInterpreter.ProcIIVal   поля
   .vr   StdInterpreter.ProcRVal   поля
   .vri   StdInterpreter.ProcRIVal   поля
   .vrii   StdInterpreter.ProcRIIVal   поля
   .vrr   StdInterpreter.ProcRRVal   поля
   .vrri   StdInterpreter.ProcRRIVal   поля
   .vrrii   StdInterpreter.ProcRRIIVal   поля
   .vrs   StdInterpreter.ProcRSVal   поля
   .vrsi   StdInterpreter.ProcRSIVal   поля
   .vrsii   StdInterpreter.ProcRSIIVal   поля
   .vs   StdInterpreter.ProcSVal   поля
   .vsi   StdInterpreter.ProcSIVal   поля
   .vsii   StdInterpreter.ProcSIIVal   поля
   .vsr   StdInterpreter.ProcSRVal   поля
   .vsri   StdInterpreter.ProcSRIVal   поля
   .vsrii   StdInterpreter.ProcSRIIVal   поля
   .vss   StdInterpreter.ProcSSVal   поля
   .vssi   StdInterpreter.ProcSSIVal   поля
   .vssii   StdInterpreter.ProcSSIIVal   поля
 StdInterpreter.Command   [00001260H]
   .left   StdInterpreter.Ident   "Пример"
   .ptype   INTEGER   0
   .right   StdInterpreter.Ident   "описать_живность"
 StdInterpreter.CallHook.Call   [00001385H]
   .ch   CHAR   0X
   .e   ARRAY 64 OF CHAR   ""   ...
   .errorMsg   ARRAY 2 OF CHAR   " "
   .f   ARRAY 64 OF CHAR   ""   ...
   .g   ARRAY 64 OF CHAR   ""   ...
   .hook   StdInterpreter.CallHook   [0105FE50H]
   .i   INTEGER   24
   .i0   INTEGER   0
   .i1   INTEGER   0
   .id   StdInterpreter.Ident   "описать_живность"
   .par0   Dialog.String   ""   ...
   .par1   Views.Title   ""   ...
   .proc   ARRAY 256 OF CHAR   "Пример.описать_живность"   ...
   .res   INTEGER   0
   .s0   Dialog.String   ""   ...
   .s1   Dialog.String   ""   ...
   .type   INTEGER   3
   .x   INTEGER   0
 Dialog.Call   [00003401H]
   .errorMsg   ARRAY 2 OF CHAR   " "
   .proc   ARRAY 256 OF CHAR   "Пример.описать_живность"   ...
   .res   INTEGER   0
 DevCommanders.Execute   [00000662H]
   .beg   INTEGER   1343
   .cmd   Dialog.String   "Пример.описать_живность"   ...
   .end   INTEGER   1345
   .pos   INTEGER   1319
   .res   INTEGER   0
   .s   DevCommanders.Scanner   поля
   .t   TextModels.Model   [0119C4E0H]
   .unload   BOOLEAN   TRUE
 DevCommanders.Track   [00000795H]
   .buttons   SET   {2, 16, 25}
   .c   Models.Context   [011A22A0H]
   .end   INTEGER   1345
   .f   Views.Frame   [010DC510H]
   .h   INTEGER   123825
   .in   BOOLEAN   TRUE
   .in0   BOOLEAN   TRUE
   .isDown   BOOLEAN   FALSE
   .m   SET   {2, 25}
   .v   DevCommanders.View   [011A2270H]
   .w   INTEGER   149225
   .x   INTEGER   88900
   .y   INTEGER   41275
 DevCommanders.StdView.HandleCtrlMsg   [00000946H]
   .f   Views.Frame   [010DC510H]
   .focus   Views.View   NIL
   .msg   Controllers.TrackMsg   поля
   .v   DevCommanders.StdView   [011A2270H]
 Views.ForwardCtrlMsg   [000026B0H]
   .a   Views.View   NIL
   .f   Views.Frame   [010DC510H]
   .focus   Views.View   NIL
   .g   Views.Frame   [011A38C0H]
   .h   Views.Frame   NIL
   .msg   Controllers.TrackMsg   поля
   .op   INTEGER   0
   .req   BOOLEAN   FALSE
   .v   Views.View   [011A2270H]
 Views.ForwardCtrlMsg   [0000276BH]
   .a   Views.View   NIL
   .f   Views.Frame   [011A38C0H]
   .focus   Views.View   [011A2270H]
   .g   Views.Frame   [011A3530H]
   .h   Views.Frame   [010DC510H]
   .msg   Controllers.TrackMsg   поля
   .op   INTEGER   0
   .req   BOOLEAN   FALSE
   .v   Views.View   [0119C480H]
 Views.ForwardCtrlMsg   [0000276BH]
   .a   Views.View   NIL
   .f   Views.Frame   [011A3530H]
   .focus   Views.View   [0119C480H]
   .g   Views.Frame   NIL
   .h   Views.Frame   [011A38C0H]
   .msg   Controllers.TrackMsg   поля
   .op   INTEGER   0
   .req   BOOLEAN   FALSE
   .v   Views.View   [0119C2C0H]
 Windows.Window.ForwardCtrlMsg   [000002AFH]
   .msg   Controllers.TrackMsg   поля
   .w   Windows.Window   [011A2FD0H]
 HostWindows.Window.ForwardCtrlMsg   [00001615H]
   .d   BOOLEAN   FALSE
   .msg   Controllers.TrackMsg   поля
   .res   INTEGER   2010354855
   .w   HostWindows.Window   [011A2FD0H]
 HostWindows.Window.MouseDown   [00001BA5H]
   .modifiers   SET   {2, 16, 25}
   .ph   INTEGER   392
   .pw   INTEGER   656
   .time   INTEGER   0
   .track   Controllers.TrackMsg   поля
   .w   HostWindows.Window   [011A2FD0H]
   .x   INTEGER   16
   .y   INTEGER   366
 HostWindows.HandleMouse   [00003445H]
   .b   SET   {2, 16, 25}
   .f   Views.Frame   NIL
   .g   Views.Frame   NIL
   .isDown   BOOLEAN   TRUE
   .lParam   INTEGER   23986192
   .w   HostWindows.Window   [011A2FD0H]
   .wParam   INTEGER   265
   .wnd   INTEGER   262810
   .x   INTEGER   16
   .y   INTEGER   366
 Kernel.Try   [00003A31H]
   .a   INTEGER   262810
   .b   INTEGER   265
   .c   INTEGER   23986192
   .h   PROCEDURE   HostWindows.HandleMouse
 HostWindows.DocWinHandler   [00003FB2H]
   .dx   INTEGER   0
   .dy   INTEGER   0
   .lParam   INTEGER   23986192
   .message   INTEGER   513
   .res   INTEGER   0
   .st   SET   {5}
   .style   SET   {2, 3, 8, 9, 11..15, 17, 21}
   .w   HostWindows.Window   NIL
   .wParam   INTEGER   9
   .wnd   INTEGER   262810
   .x   INTEGER   16064144
<system>   (pc=77D38708H,  fp=0022FB84H)
<system>   (pc=77D387EAH,  fp=0022FBECH)
<system>   (pc=77D389A4H,  fp=0022FC4CH)
<system>   (pc=77D3BCCBH,  fp=0022FC5CH)
 HostMenus.Loop   [00003C86H]
   .done   BOOLEAN   FALSE
   .f   SET   {0..5}
   .n   INTEGER   0
   .res   INTEGER   0
   .w   HostWindows.Window   NIL
 Kernel.Start   [00002B5CH]
   .code   PROCEDURE   HostMenus.Loop

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 08:09 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Для меня это ― по сути артефакт.
Артефакт - это искусственная вещь, созданная человеком, помещённая в контекст некой культуры. Противоположен по смыслу вещи природной. А вы применяете как синоним "непонятного". Зачем такие слова-то писать?

Автор:  Хохулин Олег [ Пятница, 03 Декабрь, 2010 08:28 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Александр Ильин писал(а):
Хохулин Олег писал(а):
Для меня это ― по сути артефакт.
Артефакт - это искусственная вещь, созданная человеком, помещённая в контекст некой культуры. Противоположен по смыслу вещи природной. А вы применяете как синоним "непонятного". Зачем такие слова-то писать?

в определениях из разных мест: Артефакт (от лат. artefactum — искусственно сделанное). Общеупотребительное (употребляется чаще всего в смысле значения): кем-то сделано, как работает не понимаю, как использовать понимаю смутно и скорее всего не верно.
Академические определения - это конечно хорошо, но в жизни смысл слов постепенно (в наше время, кажется, ― довольно быстро) меняется.

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 08:42 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Академические определения - это конечно хорошо, но в жизни смысло слов постепенно (в наше время, кажется, ― довольно быстро) меняется.
Вы написали "для меня - по сути артефакт", словно знакомы с сутью. Сами использовали академический термин, никто вас за язык не тянул. А по сути все программы суть артефакты, что для вас, что для нас.

ББ перезапускать пробовали? У меня подозрение, что у вас не все модули перекомпилированы/перезагружены.

Автор:  Илья Ермаков [ Пятница, 03 Декабрь, 2010 09:04 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

А вот здесь:
http://www.inr.ac.ru/~info21/pdf/i21.pdf
- нету разве про трапы?

Автор:  Хохулин Олег [ Пятница, 03 Декабрь, 2010 09:22 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Александр Ильин писал(а):
ББ перезапускать пробовали? У меня подозрение, что у вас не все модули перекомпилированы/перезагружены.

Да, выгружал. Да, перезапускал.

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 09:41 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
в "отметку-0" попадает
в "отметку-1" ― нет
Разве можно так обманывать? В отметку 1 тоже попадает.

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 09:46 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

В процедурах новая_птица, новый_зверь не выделена память под строки .описание и .имя. При присвоении производится разыменование (^) пустого указателя (NIL), отсюда и трап.

Автор:  Хохулин Олег [ Пятница, 03 Декабрь, 2010 10:33 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Александр Ильин писал(а):
Хохулин Олег писал(а):
в "отметку-0" попадает
в "отметку-1" ― нет
Разве можно так обманывать? В отметку 1 тоже попадает.

Пока не влепил в модуль Птица пустую процедуру и не вызвал ее, модуль похоже не выгружался...
Чего я не понял, не заметил?

Автор:  Хохулин Олег [ Пятница, 03 Декабрь, 2010 10:40 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Александр Ильин писал(а):
В процедурах новая_птица, новый_зверь не выделена память под строки .описание и .имя. При присвоении производится разыменование (^) пустого указателя (NIL), отсюда и трап.

Спасибо, так и есть. Исправил - заработало.
Хотел бы сделать процедуру, которая инициализировала бы эти поля в модуле "Живность", а в уточнении "Птица", "Зверь" дозаполнять "добавки" . (Живность.Ини, Птица.Ини, Зверь.Ини)
Но как сделать супервызов Живность.Ини в Птица.Ини ???

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 10:43 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Чего я не понял, не заметил?
Если модуль используется (импортирован) каким-то другим загруженным модулем, то сначала нужно выгрузить этот другой.
Для правильного порядка выгрузки я обычно пишу коммандер такого вида: ^Q DevDebug.UnloadThis Пример ПримерПтица ПримерЖивность ПримерЗверь~

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 10:45 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Но как сделать супервызов Живность.Ини в Птица.Ини ???
Код:
ПРОЦЕДУРА (зверь: Зверь) Init;
НАЧАЛО
   зверь.Init^
КОНЕЦ Init;

Автор:  Евгений Темиргалеев [ Пятница, 03 Декабрь, 2010 10:49 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Александр Ильин писал(а):
В процедурах новая_птица, новый_зверь не выделена память под строки .описание и .имя. При присвоении производится разыменование (^) пустого указателя (NIL), отсюда и трап.
Спасибо, так и есть. Исправил - заработало.
Место разыменовывания нулевого указателя доступно через трэп по одному тычку.
1) Вы его нашли и не поняли, что нужно выделить память?
или
2) Вы не знали как его найти? В данном случае см: http://www.inr.ac.ru/~info21/blackbox/avost/avost.htm

Автор:  Евгений Темиргалеев [ Пятница, 03 Декабрь, 2010 10:50 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Пока не влепил в модуль Птица пустую процедуру и не вызвал ее, модуль похоже не выгружался...
Чего я не понял, не заметил?
http://www.inr.ac.ru/~info21/blackbox/welcome.html = Первые сведения о работе в системе Блэкбокс

http://www.inr.ac.ru/~info21/blackbox/dev/zagruzka.htm = Загрузка и перезагрузка модулей

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 10:53 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Евгений Темиргалеев писал(а):
Место разыменовывания нулевого указателя доступно через трэп по одному тычку.
Данное утверждение истинно только при работе с исходниками с английскими ключевыми словами (MODULE, PROCEDURE, BEGIN и т.д.).

Автор:  Евгений Темиргалеев [ Пятница, 03 Декабрь, 2010 10:54 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Хотел бы сделать процедуру, которая инициализировала бы эти поля в модуле "Живность", а в уточнении "Птица", "Зверь" дозаполнять "добавки" . (Живность.Ини, Птица.Ини, Зверь.Ини)
Для этого не обязательно делать супервызов. Инициализировать поля может и обычная процедура
Код:
ПРОЦЕДУРА Ини* (эта_живность:Живность);
Или я чего-то не понимаю?

Автор:  Евгений Темиргалеев [ Пятница, 03 Декабрь, 2010 11:11 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Александр Ильин писал(а):
Евгений Темиргалеев писал(а):
Место разыменовывания нулевого указателя доступно через трэп по одному тычку.
Данное утверждение истинно только при работе с исходниками с английскими ключевыми словами (MODULE, PROCEDURE, BEGIN и т.д.).
Странно... у меня была уверенность, что info21 эту проблему решил. Она, кажется, на форуме где-то обсуждалась.

Автор:  Александр Ильин [ Пятница, 03 Декабрь, 2010 11:14 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Евгений Темиргалеев писал(а):
Странно... у меня была уверенность, что info21 эту проблему решил. Она, кажется, на форуме где-то обсуждалась.
Позиции для трапов зашиваются в объектный файл компилятором. Компилятор видит только переводной вариант текста с английскими ключевыми словами.

Обсуждалась проблема позиционирования маркеров ошибок компиляции.

Автор:  Info21 [ Пятница, 03 Декабрь, 2010 13:36 ]
Заголовок сообщения:  Re: Проблема с вызовом метода. Помогите, кто может!

Хохулин Олег писал(а):
Но как сделать супервызов Живность.Ини в Птица.Ини ???
Супервызовы -- нехорошая вещь. Тем более, что и не нужная.

Процедуру, специфическую для конкретного уровня наследования, оформите как простую процедуру. Соотв. модуль всё равно всегда будет виден в контексте вызова, так что с вызовом проблем не будет.

Где-то Вы уже подпортили себе ... вкус. Что читали, если не секрет?

Автор:  Info21 [ Пятница, 03 Декабрь, 2010 13:38 ]
Заголовок сообщения:  Re: Помогите разобраться как грамотно пользоваться трапом.

Коллеги, вы даете ссылки на устаревшие документы.

*Вся* документация в надлежащим образом переработанном виде есть в школьной версии, доступна через Справку для учителя и проч.
У человека уже есть школьная версия, не надо его зря путать.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/