Если объект данного типа становится определенным, то в этот же момент все связанные с ним объекты иного типа становятся неопределенными, а все связанные с ним объекты того же самого типа становятся, если не оговорено противное, определенными.
Связь подстановкой параметров допускается лишь при совпадении типов, причем правило таково: объект, порожденный подстановкой параметров, определен в момент входа (в процедуру) только в том случае, если был определен фактический параметр. Если объект, порожденный подстановкой параметров, при выполнении программного модуля становится (пока связь существует) Определенным или неопределенным, то соответствующие фактические объекты во всех вызывающих программных модулях становятся соответственно определенными или неопределенными.
События, обеспечивающие определение. Переменные и элементы массивов становятся начально определенными в случае, когда их имена связаны при помощи объявления начальных данных с константой того же типа, что и тип соответствующей переменной или массива. Любой объект, не определенный начально, является неопределенным к началу первого выполнения первого оператора головного модуля. Переопределение определенного объекта допускается всегда, за исключением некоторых случаев для переменных типа целый (пп. 7.1.2.8, 7.1.3.2.1 и 7.2.1.1.2), а также объектов программных модулей (пп. 6.4, 8.3.2 и 8.4.2).
Переменные и элементы массивов становятся определенными (или переопределенными) в следующих случаях:
завершение выполнения арифметического или логического оператора присваивания вызывает определение объекта, расположенного слева от знака равенства;
при выполнении оператора ввода каждый объект, которому присваивается значение соответствующего типа из внешней среды ввода, становится определенным в момент этого присваивания. Связанные объекты одинакового типа становятся определенными лишь по завершении выполнения этого оператора ввода;
завершение выполнения оператора цикла способом, приведенным в п. 7.1.2.8.2г, вызывает определение управляющей переменной этого цикла;
начало выполнения действий, определяемых списком с циклом, вызывает определение управляющей переменной этого списка.
Переменные и элементы массивов становятся неопределенными в следующих случаях:
в момент завершения оператора цикла способом, приведенным в п. 7.1.2.8.2г, управляющая переменная этого цикла становится неопределенной;
завершение выполнения оператора предписания вызывает неопределенность переменной, входящей в этот оператор;
при выполнении модулей-функций некоторые объекты (п. 10.2.9) могут стать неопределенными;
завершение выполнения действий, определяемых списком с циклом, вызывает неопределенность управляющей переменной этого списка;
когда объект, связанный с данным объектом и имеющий иной тип, становится определенным;
когда объект, связанный с данным объектом и имеющий такой же тип, становится неопределенным.
Объекты непомеченного общего блока. Объекты непомеченного общего блока и связанные с ним объекты не могут быть начально определены.
Такие объекты, ставшие однажды определенными по любому из приведенных выше правил, остаются определенными до тех пор, пока не станут неопределенными в соответствии с этими же правилами.
Объекты помеченного общего блока. Объекты помеченного общего блока и связанные с ним объекты могут быть начально определены.
Говорят, что программный модуль содержит имя помеченного общего блока, если это имя встречается в этом программном модуле в качестве имени блока. Если программный модуль содержит имя помеченного общего блока, то любой объект этого блока (и связанные с ним объекты), ставшие однажды определенными по любому из приведенных в п. 10.2.3 правил, остаются определенными до тех пор, пока не станут неопределенными в соответствии с этими же правилами.
Необходимо заметить, что переопределение начально определенного объекта не означает, что этот объект не может впоследствии стать неопределенным. Особо отметим, что если в некотором программном модуле содержится имя помеченного общего блока, не содержащееся ни в одном программном модуле, прямо или косвенно ссылающемся на этот модуль, то выполнение оператора возврата этого модуля вызывает неопределенность всех объектов данного блока и связанных с ними объектов, за исключением начально определенных объектов, сохраняющих свои начально определенные значения.
Объекты не из общего блока. Любой объект не из общего блока, кроме формального параметра или значения функции, может быть начально определен.
Такие объекты, ставшие однажды определенными по любому из приведенных выше правил, остаются определенными до тех пор, пока не станут неопределенными в соответствии с этими же правилами.
Если такой объект используется в программном модуле, то завершение выполнения оператора возврата этого модуля вызывает неопределенность всех таких объектов и связанных с ними в этот момент объектов (за исключением начально определенных, которые не были переопределены и не стали неопределенными). В связи с этим необходимо подчеркнуть, что связь между формальными и фактическими параметрами прекращается в момент начала выполнения оператора возврата.
Необходимо подчеркнуть, что переопределение начально определенного объекта не означает, что этот объект впоследствии не может стать неопределенным.
Основа. Основой в программном модуле называется последовательность, состоящая из одного или более операторов, которая определяется следующим образом.
Конечными операторами основы являются:
оператор цикла;
оператор вызова подпрограммы;
оператор перехода любого типа;
условный арифметический оператор;
оператор останова;
оператор возврата;
первый из операторов (если он существует), непосредственно предшествующих оператору, метка которого употребляется в операторе перехода или условном арифметическом операторе;
арифметический оператор присваивания, в котором слева от знака равенства стоит переменная типа целый;
оператор ввода, в списке которого содержится переменная типа целый;
условный логический оператор, содержащий любой из перечисленных выше допустимых операторов.
Начальными операторами основы являются:
первый оператор в программном модуле;
первый из операторов (если он существует), непосредственно следующий за конечным оператором некоторой другой основы.
Каждый начальный оператор основы задает некоторую основу. Если этот начальный оператор является также и конечным оператором основы, то она состоит лишь из одного этого оператора. Если же это не так, то основа состоит из начального оператора и всех последующих операторов до конечного оператора основы включительно.
Последний оператор. В любом программном модуле последний по порядку оператор должен быть либо оператором перехода, либо условным арифметическим оператором, либо оператором останова, либо оператором возврата. Последний оператор не может быть частью условного логического оператора.
Второй уровень определения. В момент использования в индексах и вычисляемых операторах перехода переменные типа целый должны быть определены на втором уровне.
Если при выполнении некоторой основы выполнимой программы происходит переопределение переменной типа целый, то эта переменная и все связанные с ней переменные становятся неопределенными на втором уровне во всей этой основе.
В момент выполнения начального оператора основы переменная типа целый является определенной на втором уровне, если выполняются следующие условия:
в этой основе указанная переменная употребляется в индексе или вычисляемом операторе перехода;
в момент выполнения начального оператора этой основы указанная переменная определена на первом уровне.
Такое определение сохраняется до тех пор, пока не произойдет одно из следующих событий:
завершение выполнения конечного оператора этой основы;
указанная переменная становится неопределенной или переопределяется на первом уровне.
В этот момент указанная переменная становится неопределенной на втором уровне.
Вхождение переменной типа целый в список оператора ввода, в котором эта переменная употребляется также и в индексе, означает, что эта переменная станет определенной на втором уровне. Такое определение сохранится до тех пор, пока не произойдет одно из следующих событий:
завершение выполнения конечного оператора основы, содержащей этот оператор ввода;
указанная переменная становится неопределенной или переопределяется на первом уровне.
Переменная типа целый, использующаяся в качестве управляющей переменной списка с циклом, определена на втором уровне в области действия этого списка и только в этой области.
Некоторые объекты модулей-функций. Если в пределах одного оператора встречается более одного обращения к некоторому модулю-функции с одним и тем же списком фактических параметров, то выполнение этого модуля должно давать для всех этих случаев одни и те же результаты независимо от способа выполнения оператора.
Если оператор содержит множитель, который можно не вычислять (п. 6.4), а в этом множителе содержится ссылка на функцию, то все объекты, которые могли бы быть определены при выполнении этой ссылки на функцию, становятся неопределенными при завершении вычисления выражения, содержащего этот множитель.
Требования определенности используемых объектов. Любая переменная, употребляемая в индексе или вычисляемом операторе перехода, должна быть определена на втором уровне в момент ее использования.
Любая переменная, элемент массива или ссылка на функцию, употребляемые в качестве первичного выражения, а также любая ссылка на подпрограмму при помощи оператора вызова подпрограммы должны быть определены в момент их использования. В том случае, когда фактический параметр в списке параметров ссылки на внешнюю процедуру является именем переменной или именем элемента массива, на этот фактический параметр не накладывается требование определенности в момент ссылки на эту процедуру; однако если такой параметр является именем внешней процедуры, он должен быть определен.
Любая переменная, употребляемая в качестве начального параметра, конечного параметра или параметра приращения в операторе цикла или списке с циклом, должна быть определена в момент ее использования.
Любая переменная, употребляемая для идентификации устройства ввода/вывода, должна быть определена в момент ее использования.
В момент выполнения оператора возврата в модуле-функции значение (п. 8.3.1) этой функции должно быть определено.
В момент выполнения оператора вывода каждый объект, значение которого передается вовне, должен быть определен, за исключением случая, когда происходит вывод форматной записи (или ее части) и код преобразования есть А (то есть, вывод текста). Для остальных случаев вывода форматных записей требуется правильная связь кода преобразования с типом объекта. Следующие связи являются правильными: I — с типом целый; D — с типом двойной точности; Е, F и G — с типами вещественный и комплексный; L — с типом логический.
(Измененная редакция, Изм. № 1).
АЛФАВИТНЫЙ УКАЗАТЕЛЬ ТЕРМИНОВ
Алфавит ФОРТРАНа 3.1
Арифметический оператор присваивания 7.1.1.1
Арифметическое выражение 6.1
Безусловный оператор перехода 7.1.2.1.1
Буквенно-цифровые символы 3.1.3
Буквы 3.1.2
Вещественное число без знака 5.1.1.2
Взаимодействие форматного управления со списком ввода/вывода 7.2.3.4
Внешняя процедура 2.3, 10.1.4
Внешняя функция 8.3, 10.1.8
Внутренняя функция 8.1, 10.1.6
Вспомогательный оператор ввода/вывода 7.1.3.3
Встроенная функция 8.2, 10.1.7
Выполнимая программа 9.1.7
Выражения 6
Вычисляемый оператор перехода 7.1.2.1.3
Головной модуль 9.1.4
Дробная черта 3.1.4
Заключительная строка 3.2.2
Запятая 3.1.4
Звездочка 3.1.4
Знак денежной единицы 3.1.4
Идентификация данных 5
Идентификация процедур 5
Имя блока 7.2.1.3, 10.1.10
Имя данного 5.1
Имя процедуры 5.1
Индекс 5.1.3.2
ндексное выражение 5.1.3.3
Класс 10.1
Комментарий 3.2.1
Комплексное число 5.1.1.4
Константа 5.1.1
Круглая скобка левая 3.1.4
Круглая скобка правая 3.1.4
Логическая константа 5.1.1.5
Логический оператор присваивания 7.1.1.2
Логическое выражение 6.3
Массив 5.1.3, 10.1.3
Масштабный множитель 7.2.3.5
Метка предложения 3.4
Минус 3.1.4
Модуль-блок данных 8.5, 9.1.5
Модуль-подпрограмма 8.4.1
Модуль-процедура 9.1.6
Модуль-функция 8.3.1
Начальная строка 3.2.3
Общий блок 7.2.1.3
Общий объект 7.2.1.3
Объявление 7.2
Объявление внешних имен 7.2.1.5
Объявление массивов 7.2.1.2
Объявление начальных данных 7.2.2
Объявление общих объектов 7.2.1.3
Объявление спецификаций 7.2.1
Объявление типа 7.2.1.6
Объявление формата 7.2.3
Объявление эквивалентности 7.2.1.4
Оператор 7.1
Оператор бесформатного ввода 7.1.3.2.4
Оператор бесформатного вывода 7.1.3.2.3
Оператор ввода/вывода 7.1.3
Оператор возврата 7.1.2.5
Оператор вызова подпрограммы 7.1.2.4
Оператор останова 7.1.2.7.1
Оператор паузы 7.1.2.7.2
Оператор перемотки 7.1.3.3.1
Оператор перехода 7.1.2.1