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 и т.д.). |
Автор: | Александр Ильин [ Пятница, 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/ |