Изучение основ моделирования в среде GPSS World. Создание пользовательских переменных. Блоки и команды для манипуляции с сохранёнными данными, страница 7

Теперь нам осталось рассмотреть последний оператор – оператор вызова процедур. Это абстрактный оператор, т.к. представляет собой сочетание имени вызываемой процедуры и списка фактических параметров. Данный оператор имеет следующий синтаксис:

<имя процедуры>([список фактических параметров])

Данный оператор служит для вызова одних процедур из других или в операндах блоков GPSS.

Так же, как и в обычной модели GPSS, в PLUS процедуре можно использовать комментарий, который заключается между наборами символов "/*" и "*/". Причём нужно учесть, что комментарий в процедуре может состоять из различных символов, кроме символов кирилловского алфавита.

Теперь мы рассмотрели все операторы PLUS и перейдём к следующему, небольшому разделу – применению процедур в моделях GPSS.

Поскольку, как говорилось ранее, PLUS процедура всегда возвращает какое-либо значение, то и вызывать процедуру из модели можно только в блоках и командах, которые позволяют обрабатывать (или, как минимум, запоминать) возвращаемые значения.

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

ADVANCE      (MyProc(10))

Если же, по замыслу автора, процедура не должна возвращать значение, а лишь выполнять ряд команд (например, для заполнения матрицы), то есть смысл вызывать процедуру из таких блоков как ASSIGN или PLUS. Например, вызов функции заполняющей матрицу может выглядеть так:

ASSIGN       1,(FillMX())

В данном примере в параметр транзакта с номером 1 будет записан нуль – как результат работы процедуры. Обратите внимание, что при вызове процедуры без параметров, после имени процедуры обязательно ставятся пустые круглые скобки.

Поскольку процедуры проверяются интерпретатором в момент трансляции модели, но после обработки команд и блоков, то их (процедуры) не возможно использовать в таких командах как SHOW, START (т.к. это срочные команды), но возможно в EQU и VARIABLE.

5  Библиотечные функции PLUS

5.1  Математические и строковые

В рассматриваемом нами примере создания пользовательской процедуры, для  возвращения квадрата числа использовали арифметическое умножение. Но при необходимости произвести вычисление более сложного выражения, мы могли бы воспользоваться библиотечными математическими функциями.

Так, например, для вычисления степени экспоненты используется функция EXP(), а квадратного корня – SQR(). Полный список доступных математических функций приведён в таблице 4.

Таблица 4.  Библиотечные математические функции

Название

Обозначение

Возвращаемое значение

Дополнительно

Абсолютное значение

ABS

Модуль выражения

Арктангенс

ATN

Арктангенс числа

параметр должен быть выражен в радианах

Косинус

COS

Косинус числа

— " —

Экспонента

EXP

Степень экспоненты

Целочисленное преобразование

INT

Число, преобразованное к целому

Натуральный логарифм

LOG

Показатель степени числа e

Синус

SIN

Синус числа

параметр должен быть выражен в радианах

Квадратный корень

SQR

Квадратный корень выражения

Тангенс

TAN

Тангенс числа

параметр должен быть выражен в радианах

Тогда формулу вычисления корня квадратного уравнения можно записать как:

TEMPORARY    D;

D=b#b-4#a#c;

X1=(-b+SQR(D))/(2#a);