сделал пример из 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