Записи могут быть форматными и бесформатными. Форматная запись состоит из последовательности символов, допускающих представление в процессоре. Передача такой записи требует ссылки на спецификацию формата, которая определяет необходимые преобразования и размещение записи (п. 7.2.3). Число записей, передаваемых при выполнении операторов форматного чтения или записи, зависит от списка ввода/вывода и указанной спецификации формата (п. 7.2.3.4). Бесформатная запись состоит из последовательности значений в виде, определяемом процессором. Когда выполняется оператор форматного или бесформатного ввода, требуемые записи на указанном устройстве должны быть соответственно форматными или бесформатными.
(Измененная редакция, Изм. № 1).
Списки ввода/вывода. Список ввода определяет имена переменных и элементов массивов, которым присваиваются значения при вводе. Список вывода определяет те переменные и элементы массивов, значения которых передаются при выводе вовне. Списки ввода и списки вывода устроены одинаково.
Списком называется либо простой список, либо простой список, заключенный в круглые скобки, либо список с циклом, либо два списка, разделенных запятой.
Простой список есть либо имя переменной, либо имя элемента массива, либо имя массива, либо два простых списка, разделенных запятой.
Список с циклом — это взятая в круглые скобки последовательность, состоящая из списка и спецификации цикла, разделенных запятой.
Спецификация цикла имеет вид
І —- ГП і, ГП 2, ГП 2
ИЛИ
1 = гпнт2
(i, trip т2 и т3 определяются так же, как и для оператора цикла (п. 7.1.2.8)).
Область действия спецификации цикла — это список, входящий в состав списка с циклом; для списков ввода i, mb m2 и m3 могут встречаться внутри этой области только в индексах.
Имя переменной или имя элемента массива в списке задают самих себя. Имя массива задает имена всех элементов массива, определенных описанием массива, и эти элементы задаются в порядке, определяемом функцией линеаризации (п. 7.2.1.1.1).
Элементы списка считаются упорядоченными в соответствии с их вхождением в список при его просмотре слева направо. Это упорядочение элементов в списке с циклом имеет место для каждого очередного повторения цикла.
Оператор форматного ввода. Оператор форматного ввода имеет вид
READ (u, f) к или
READ (u, f)
(к — список ввода).
В результате выполнения этого оператора вводятся очередные записи с устройства, заданного и. Вводимые данные просматриваются и преобразуются в соответствии с форматом, заданным f. Полученные в результате значения присваиваются элементам, определенным списком к (см. п. 7.2.3.4).
Оператор форматного вывода. Оператор форматного вывода имеет вид
WRITE (u, f) к или
WRITE (u, f)
(к — список вывода).
В результате выполнения этого оператора создаются очередные записи на устройстве, заданном и. Список вывода к определяет последовательность передаваемых значений. Эти значения преобразуются и разносятся по позициям в соответствии с форматом, заданным f (см. п. 7.2.3.4).
Оператор бесформатного ввода. Оператор бесформатного ввода имеет вид
READ (и) к или
READ (и)
(к — список ввода).
В результате выполнения этого оператора с устройства, заданного и, вводится очередная запись и — если имеется список ввода — значения, содержащиеся в этой записи, последовательно присваиваются элементам, определенным списком к. Последовательность значений, требуемая списком, не может быть длиннее последовательности значений в бесформатной записи.
Оператор бесформатного вывода. Оператор бесформатного вывода имеет вид
WRITE (u) к
(к — список вывода).
В результате выполнения этого оператора на устройстве, заданном и, создается очередная запись, состоящая из последовательности значений, определяемой списком к.
Вспомогательные операторы ввода/вывода. Существует три типа вспомогательных операторов ввода/вывода:
оператор перемотки;
оператор сдвига назад;
оператор разметки.
Оператор перемотки. Оператор перемотки имеет вид REWIND и
В результате выполнения этого оператора устройство, заданное и, устанавливается в начальную позицию.
Оператор сдвига назад. Оператор сдвига назад имеет вид
BACKSPACE и
Если устройство, заданное и, находится в начальной позиции, то в результате выполнения этого оператора продолжается нормальный порядок выполнения операторов; в противном случае, кроме этого, позиция устройства изменяется таким образом, что запись, которая до выполнения этого оператора была предыдущей, становится очередной.
Оператор разметки. Оператор разметки имеет вид
ENDFILE и
В результате выполнения этого оператора на устройство, заданное и, выводится специальная запись «конец файла». «Конец файла» — это единственная запись, обозначающая границу последовательного файла. Если запись «конец файла» встретится при выполнении какого-либо оператора ввода, то действие такого оператора не определено.
Вывод форматных записей на печать. При передаче форматной записи на печать ее первый символ не печатается.
7.2. Объявления. Имеется четыре типа объявлений:
объявления спецификаций;
объявление формата;
объявление внутренней функции;
заголовки (функций и подпрограмм).
Ограничения на использование символических имен в объявлениях изложены в п. 10.2.
Объявления внутренних функций и заголовки (функций и подпрограмм) рассматриваются в разд. 8.
7.1.3.4, 7.2 (Измененная редакция, Изм. № 1).
Объявления спецификаций. Имеется три типа объявлений спецификаций:
объявление массивов;
объявление общих объектов;
объявление эквивалентности.
Описание массива. Описание массива задает характеристики массива, используемого в рассматриваемом модуле.
Описание массива указывает символическое имя массива, число измерений (одно или два) и размеры по каждому измерению. Описание массива может встречаться в объявлениях массивов.
Описание массива имеет вид
v(i)
(v ■— символическое имя, называемое именем описания;
і — список границ).
Список границ состоит из одного целого числа без знака или двух целых чисел без знака, разделенных запятой.
Наличие списка границ в каком-либо описании служит для информирования процессора о том, что это имя описания является именем массива. Количество целых чисел без знака, образующих список границ, указывает размерность массива. Значения выражений в описании массива определяют максимальное значение, которое может принимать индекс в любом имени элемента этого массива (п. 7.2.1.1.1).
Значение индекса в имени элемента массива не должно быть меньше единицы или больше максимального значения, определенного описанием этого массива.
Функция линеаризации массива и значение индекса. В табл. 2 для заданных размерности, списка границ и индекса в имени элемента массива приведено значение индекса этого элемента массива, а также максимальное значение, которое могут принимать индексы в именах элементов этого массива. Значения всех индексных выражений должны быть больше нуля.
Функция линеаризации упорядочивает все элементы любого массива. Значение этой функции для некоторого данного элемента получается прибавлением единицы к соответствующему значению, указанному в графе «Значение индекса». Элемент массива, индекс которого имеет это значение, следует непосредственно за данным элементом. Последний элемент массива — это элемент, значение индекса которого равно максимально допустимому значению; для этого элемента не существует непосредственно следующего за ним элемента.
Таблица 2
Размерность |
Список границ |
Индекс |
Значение индекса |
Максимальное значение индекса |
1 |
(А) |
(а) |
а |
А |
2 |
(А, В) |
(а, Ь) |
а + А • (b— 1) |
А • В |
Примечание, а и b — индексные выражения; А и В — верхние границы по измерениям.
Регулируемые размеры — отсутствует; определение — по ГОСТ 23056—78.
Объявление массивов. Объявление массивов имеет вид
DIMENSION V, (і,), v2(i2),..„ vn(in)
(каждое Vj (ij) —описание массива).
Объявление общих объектов. Объявление общих объектов имеет вид
COMMON а,, а2,...,ап
(каждое — имя переменной или имя массива).
Все объекты, перечисленные в конкретном объявлении общих объектов, считаются входящими в общий блок.
В программном модуле может быть несколько объявлений общих объектов. Все такие объекты располагаются в общем блоке в порядке их появления (п. 10.1.2). При этом первый элемент массива будет непосредственно следовать за предыдущим объектом (если таковой существует), а последний элемент массива будет непосредственно предшествовать следующему объекту (если таковой существует).
Размер общего блока в программном модуле равен сумме объемов памяти, требуемых для размещения объектов, включенных в общий блок при помощи объявлений общих объектов и эквивалентности (п. 7.2.1.4). Размер общего блока не обязан быть одним и тем же в разных совместно выполняемых программных модулях. Размер блока измеряется в единицах памяти (п. 7.2.1.3.1).
Соответствие общих блоков. Пусть все объявления общего блока в программных модулях выполнимой программы определяют одну и ту же длину общего блока и, кроме того, типы объектов, расположенных в одинаковых позициях различных объявлений этого блока, совпадают. Тогда значения в соответствующих позициях общего блока (определенных по числу предшествующих единиц памяти) будут во всей выполнимой программе одними и теми же.
Считается, что объект типа целый или вещественный занимает одну единицу памяти.
Для общего блока:
во всех тех программных модулях, где в данной позиции (определяемой числом предшествующих единиц памяти) задан один и тот же тип, ссылки на эту позицию дают одно и то же значение;
правильная ссылка, сделанная на конкретную позицию, подразумевает тип, заданный в объявлениях, если последнее по времени присваивание в эту позицию было того же типа.
Объявление эквивалентности. Объявление эквивалентности имеет вид
EQUIVALENCE (к,), (к2),...,(к„)
(каждое к; — список вида а,, а2,..., ат;
каждое — имя переменной или 'имя элемента массива, индекс которого содержит только константы;
ГП|>2).
В списки к не могут входить формальные параметры. Число индексных выражений в имени элемента массива должно либо совпадать с числом измерений в описании массива, либо должно быть равно единице (функция лианеризации определяет правило, по которому любой массив можно свести к одномерному массиву той же самой длины).
Все элементы, образующие какой-либо список в объявлении эквивалентности, размещаются в памяти, начиная с одной и той же единицы памяти. Объявление эквивалентности не должно использоваться для того, чтобы сделать две или более величины математически эквивалентными.
Отведение памяти для переменных или массивов, объявленных непосредственно в объявлении общих объектов, производится только с учетом их типов, объявлений общих объектов и описаний массивов. Объявленным таким образом объектам всегда отводится память в том порядке, в котором они следуют в объявлении общих объектов.
Результатом объявления эквивалентности по отношении к общим объектам может быть лишь удлинение общего блока; при этом разрешается только такое удлинение, которое расширяет общий блок за последний, но не за первый объект этого блока, определенный непосредственно в объявлении общих объектов.
Если две переменные или элементы двух массивов совмещаются в памяти в результате эффекта объявления эквивалентности, то имена этих переменных или массивов в данном программном модуле не могут одновременно встречаться в объявлении общих объектов.
Информация, содержащаяся в пп. 7.2.1.1.1, 7.2.1.3.1 и в настоящем пункте, достаточна для того, чтобы описать возможности дополнительных случаев совмещения в памяти элементов массивов и объектов из общих блоков. Не допускается явное или неявное отведение одной и той же единицы памяти для хранения более чем одного элемента одного и того же массива.
(Измененная редакция, Изм. № 1).
Объявление внешних имен — отсутствует; определение — по ГОСТ 23056—78.
Объявление типа — отсутствует; определение — по ГОСТ 23056—78.
Объявление начальных данных — отсутствует; определение — по ГОСТ 23056—78.
Объявление формата. Объявления формата используются в связи с форматным вводом/выводом для указания необходимого преобразования и редактирования информации при переходе от ее внутреннего представления к внешней последовательности символов и обратно.
Объявление формата имеет вид
FORMAT (q1t1zlt2z2...zn ]tnq2)
(каждое qj — серия дробных черт или пусто;