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

Рассмотрим пример с использованием изученных библиотечных функций.

Пусть есть две строки, содержащие входные данные. Нужно заполнить матрицу из этих строк с помощью PLUS процедуры. А также нужно подсчитать и вернуть

MyMX              MATRIX       ,2,3

GENERATE     1

ASSIGN       1,(MyProc())

TERMINATE    1

PROCEDURE         MyProc()     BEGIN

TEMPORARY    Str1,Str2,Cnt;

Str1="First Second Third";

Str2="0.5 0.3 1.0";

Cnt=1;

WHILE(Cnt<4) DO BEGIN

MyMX[1,Cnt]=WORD(Str1,Cnt);

MyMX[2,Cnt]=WORD(Str2,Cnt);

Cnt=Cnt+1;

END;

END;

В результате работы данной модели получится следующий массив:

First

Second

Third

0.5

0.3

1.0

5.2  Для работы с потоками

И остался последний набор библиотечных функций, который стоит рассмотреть. Это функции для работы с потоками. Таких функций всего пять, и все они приведены в таблице 6. Сразу стоит сказать, что все эти функции возвращают какие-либо значения (в основном целочисленные), а значит, их следует использовать совместно с оператором присваивания.

Также следует обратить внимание на то, что если не указывать имя файла в функции OPEN, то в качестве потока будет выступать некоторый объём оперативной памяти. Ещё стоит упомянуть о функции OPEN то, что при указании имени файла можно использовать как относительный, так и абсолютный пути.

Обратите внимание и на то, что всем функциям из таблицы 6 передаётся некоторый параметр DataStream. Данный параметр отвечает за номер потока, с которым в текущий момент идёт работа. DataStream может быть только целым положительным числом (DataStream>0). Одновременно можно открыть несколько потоков, при этом у каждого должен быть свой числовой идентификатор.

Таблица 6. Библиотечные функции для работы с потоками

Наименование

Обозначение

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

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

Инициализация потока

OPEN(<DataStream>,<FileName>)

0 – нет ошибок

10 – слишком длинное имя файла

11 – ошибка чтения внешнего файла

12 – ошибка доступа к памяти при попытке доступа к существующему файлу

Если не указано имя фала, потоком будет память

Закрытие потока

CLOSE(<DataStream>)

0 – нет ошибок

41 – ошибка ввода-вывода при записи на диск

43 неудачная попытка открытия потока

Чтение из потока

READ(<DataStream>)

Прочитанная строка

21 – ошибка доступа к памяти при чтении из файла

22 – неудачная попытка открытия потока

После чтения строки происходит автоматический переход на следующую строку потока.

При чтении символа EOF возвращается пустая строка

Запись строки в поток

WRITE(<DataStream>,<String>)

0 – нет ошибок

31 – ошибка доступа к памяти  при записи

32 – неудачная попытка открытия потока

С помощью данной команды происходит вставка строки в текущую позицию

Переход к новой строке в потоке

SEEK(<DataStream>,<NewLine>)

0 – нет ошибок

51 – неудачная попытка открытия потока

Строки нумеруются по порядку, начиная с 1

Если при открытии потока для записи, был указан не существующий файл, то после закрытия этого потока в файловой системе сформируется новый файл с указанным именем. Если же был указан не существующий файл при открытии на чтение, то в качестве источника потока будет – память.

При попытке записать в файл неопределённые данные (например, данные из неинициализированной ячейки матрицы), то произойдёт останов системы с ошибкой:

Operand B. Invalid expression.

Datum has not been initialized.

Что означает:

Неверное выражение в операнде B.