Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Разработка имитационных моделей в виде приложений с интерфейсом
8.1. Применение текстовых объектов и потоков данных
Модель представляет собой набор операторов, содержащихся в одном объекте "Модель" и в любом количестве необязательных текстовых объектов.
Текстовые объекты с наборами операторов модели подключаются к объекту "Модель" командой INCLUDE. Формат команды:
INCLUDE A
Операнд А - спецификация файла (полный путь доступа к файлу). Допустимые значения - String. Например:
INCLUDE "DanDon.txt" INCLUDE "D:\Primer\DanZad.txt"
В первом примере путь доступа к файлу не приводится, так как предполагается, что файл с указанным именем находится в папке модели. Во втором примере указан путь доступа к файлу.
Команда INCLUDE является срочной командой. При трансляции она заменяется файлом. Поэтому располагать в модели команду INCLUDE нужно там, где должны быть операторы или команды, содержащиеся в файле.
Все дополнительно вводимые файлы нумеруются транслятором целыми числами, начиная с 0. Номер 0 присваивается объекту-модели. Нескольким вводам одного файла также присваиваются уникальные номера, т. е. каждый ввод файла приводит к созданию отличающихся наборов блоков.
Команда INCLUDE допускает пять уровней вложенности файлов модели. Нельзя помещать команду INCLUDE в Plus-процедуру.
Операторы INCLUDE можно также закреплять за функциональными клавишами. Это позволяет одним нажатием клавиши объекту "Процесс моделирования" передать набор команд и (или) Plus-операторов, содержащихся в текстовом файле.
Текстовые объекты применяются и вместе с потоками данных. Потоки данных позволяют процессу моделирования считывать из файлов и записывать данные в файлы, а также создавать файлы результатов моделирования для последующего использования.
Поток данных - это последовательность текстовых строк, используемых процессом моделирования. Существуют два типа потоков данных:
- потоки ввода-вывода (I/O или "файловые" потоки) для доступа к файлам;
- потоки в памяти для тестирования или прямого доступа к внутренним данным.
Основной элемент потока данных - текстовая строка, которая является строкой печатных символов, включая пробелы.
Для обработки потоков данных существуют пять блоков GPSS World: OPEN, CLOSE, READ, WRITE, SEEK. Три из них - READ, WRITE, SEEK - выполняют операции только с одной отдельной строкой текста.
Перейдем к рассмотрению блоков обработки потоков данных.
8.1.1. Блок OPEN
Блок OPEN предназначен для инициализации потока данных. Формат блока:
OPEN A,[B],[C]
Операнд А - дескриптор потока данных. Операнд определяет тип потока данных. Он обрабатывается как строка. Если это нулевая строка, создается поток в памяти. Если это канальное имя, такое как "\pipe\mypipe", создается канальный поток. В противном случае создается поток ввода-вывода и предполагается, что операнд А является спецификацией файла.
Операнд В - номер потока данных, произвольное положительное число, задаваемое пользователем. Нумерация потоков введена с целью использования одновременно в одном процессе моделирования нескольких потоков данных. По умолчанию номер потока данных равен 1.
Операнд С - метка блока, в который направляется транзакт в случае ошибки инициализации потока данных. Коды ошибок:
- 0 - нет ошибки;
- 10 - длинное имя файла;
- 11 - ошибка чтения внешнего файла;
- 12 - во время попытки открыть файл был запрещен доступ к памяти.
OPEN ("Plan.txt"),3,Kon1 OPEN ("G\Model\NorPogr.txt") OPEN ("")
В первом примере открывается поток ввода-вывода, потоку присваивается номер 3 и в случае ошибки открытия активный транзакт направляется к блоку с меткой Kon1. Операндом А указан неполный путь доступа к файлу, поэтому подразумевается, что используется папка объекта "Процесс моделирования". Если файл с указанным именем не найден, то предполагается, что файл создается, и ошибка не возникает.
Во втором примере операндом А указан полный путь доступа к файлу, открываемому потоку ввода-вывода по умолчанию присваивается номер один. В случае ошибки открытия активный транзакт направляется к следующему по порядку блоку.
В третьем примере открывается поток в памяти.
8.1.2. Блок CLOSE
Блок CLOSE предназначен для закрытия потока данных. Формат блока:
CLOSE A,[B],[C]
Операнд А - номер или имя параметра транзакта, в который записывается код ошибки закрытия потока данных. Если такой параметр не существует, он создается.
Операнд В - номер закрываемого потока данных, по умолчанию равен 1, т. е. если операнд В не используется, закрывается поток номер один.
Операнд С - метка блока, в который направляется транзакт в случае ошибки закрытия потока данных. Коды ошибок:
- 0 - нет ошибки;
- 41 - запись файла на диск не произведена из-за ошибки ввода-вывода;
- 42 - файл не был открыт.
Например:
CLOSE Parm_Error,(P1+1)
В примере блок CLOSE закрывает поток данных, номер которого задан выражением в скобках. Это выражение вычисляется, округляется и используется в качестве номера потока данных (должен быть положительным целым числом).
Блок CLOSE для потоков ввода-вывода записывает данные из виртуальной памяти в дисковый файл.
8.1.3. Блок READ
Блок READ предназначен для считывания из потока данных текстовой строки. Формат блока:
READ A,[B],[C]
Операнд А - номер или имя параметра транзакта, в который записывается считанная из потока ввода или потока в памяти строка, находящаяся на позиции текущей строки. После считывания позиция текущей строки увеличивается на единицу. Если такой параметр активного транзакта не существует, он создается.
Операнд В - номер потока данных, из которого производится считывание. По умолчанию равен 1, т. е. если операнд В не используется, считывание производится из потока номер один.
Операнд С - метка блока, в который направляется транзакт в случае ошибки считывания. Если операнд С не используется, код ошибки все равно сохраняется. Для его получения нужно использовать блок CLOSE. Коды ошибок:
- 21 - во время попытки выполнить чтение был запрещен доступ к памяти;
- 22 - файл не был открыт.
Например:
READ Stroka_Text,4,Kon5
В примере блок READ считывает текстовую строку из потока данных номер 4 и записывает в параметр транзакта с именем Stro-ka_Text. Если текстовая строка считывается без ошибки, а параметр активного транзакта не существует, он создается. В случае ошибки строка не считывается и активный транзакт направляется к блоку с меткой Kon5.
8.1.4. Блок WRITE
Блок WRITE предназначен для передачи текстовой строки потоку данных. Формат блока:
WRITE A,[B],[C],[D]
Операнд А - текстовая строка, которая должна быть передана потоку данных.
Операнд В - номер потока данных, по умолчанию равен 1.
Операнд С - метка блока, в который направляется транзакт в случае ошибки записи. Коды ошибок:
- 0 - нет ошибки;
- 31 - во время попытки выполнить запись был запрещен доступ к памяти;
- 32 - файл не был открыт.
Операнд D - задает режим работы блока WRITE. Если операнд D не используется (по умолчанию) или равен ON, блок WRITE работает в режиме вставки. Если операнд D равен OFF - в режиме замены.
- все текстовые строки, находящиеся на или за позицией текущей строки, сдвигаются на одну позицию;
- если позиция текущей строки находится далеко за последней текстовой строкой, она устанавливается сразу после последней строки потока данных;
- копия новой текстовой строки помещается на позицию текущей строки;
- позиция текущей строки увеличивается на единицу. Режим замены:
- если позиция текущей строки находится далеко за последней текстовой строкой, все промежуточные позиции заполняются нулевыми текстовыми строками;
- текстовая строка, находящаяся на позиции текущей строки, удаляется;
- копия новой текстовой строки помещается на позицию текущей строки;
- позиция текущей строки увеличивается на единицу. Пример:
WRITE "INITIAL MX$TDon(1,1),420",5,Met3
В этом примере блок WRITE передает текстовую строку потоку данных с номером 5. Если происходит ошибка, активный транзакт переходит к блоку с меткой Met3. Иначе он переходит к следующему по порядку блоку. Если в данном случае поток данных является потоком вывода или потоком в памяти, запись производится в режиме вставки, так как операнд D не используется.