r4 (1123693), страница 4
Текст из файла (страница 4)
При составлении моделирующей программы важно правильно организовать и использовать данные события. Рассмотрим этот вопрос. В процессе моделирования часто возникает необходимость сопоставлять планируемому событию некоторый набор данных, характеризующих это событие. Эти данные должны динамически создаваться, изменяться и уничтожаться.
Структура набора данных определяется видом модели и особенностями языка Pascal. Наиболее удобно описывать такие данные как запись, например:
DataType=record AA: integer; BB: real; CC: boolean end:
Если же данные представляют собой одну величину, то можно задать
DataType=real; или DataType=integer; ... и т.п.
В случае, если данные в модели не нужны, то тип все равно должен быть определен, например: DataType=char;
При использовании планирующих операторов требуется передавать им в качестве параметра ссылку на данные, которые к этому моменту должны быть динамически созданы, либо передать константу NIL, если у события данных нет.
Для создания данных применяется оператор New (Addr); При его выполнении в переменную Addr засылается адрес созданного набора данных. После этого можно занести необходимые значения, например: Addr^. AA:=O; Addr^. BB:=3.14; Addr^. CC:=true;
В качестве пременной для ссылки на данные можно применять не только специально для этого предназначенную системную переменную Addr, но и любую другую переменную, присвоив ей тип DataPntr.
После того, как данные сформированы, они могут быть связанны с конкретным планируемым событием модели, например: Prepare (3,205.7, Addr);
Данные события могут использоваться в моделях еще до того, как события происходят (активизируется). Доступ к данным возможен, если доступно событие. Для этого программно организуется поиск события в управляющем списке. При поиске могут использоваться системные пременные Node - указатель на головной элемент списка и Route - переменная типа ссылки на элемент списка.
Рассмотрим для примера, как осуществить смену значения в поле СС данных с True на False, для всех запланированных событий, у которых номер события равен двум, а поле АА данных отрицательно.
Route:=Node^.Next;
while Route <> Node do
begin
if (Route^.Numb = 2) and (Route^.Addr <> Nil) then
if (Route^.Addr^.AA < 0) and (Route^.Addr^.CC = True) then
Route^.Addr^.CC:=False;
Route:=Route^.Next
end;
В другом примере требуется найти адрес записи события с номером три, с максимальным запланированным временем наступления, и содержащим в поле ВВ данных нуль.
Route:=Node;
Addr:=Nil;
repeat
Route:=Route^.Prev;
if (Route^.Numb = 3) and (Route^.Addr <> Nil) then
if Route^.Addr^.BB = 0 then Addr:-Route^.Addr
until (Route = Node) or (Addr <> Nil);
При активизации события его данные доступны через системную переменную ActAddr, являющуюся ссылкой. Следует помнить, что после использования данных они должны быть уничтожены, чтобы не засорять память. Для уничтожения применяется оператор Dispose ( Addr ), в котором Addr - ссылка на данные.
Если в модели используются операторы отмены события и событие связанно с данными, то уничтожить данные можно по адресу, возвращаемому оператором, например:
Addr:=CancMin(2); Dispose (Addr);
Методическая разработка составлена п/п-ком Липовенко А.Г.
Доработана подполковник Швыдков С.А