Если объект данного типа становится определенным, то в этот же момент все связанные с ним объекты иного типа становятся неопределенными, а все связанные с ним объекты того же самого типа становятся, если не оговорено противное, определенными.

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

  1. События, обеспечивающие определение. Переменные и элементы массивов становятся начально определенными в слу­чае, когда их имена связаны при помощи объявления начальных данных с константой того же типа, что и тип соответствующей переменной или массива. Любой объект, не определенный началь­но, является неопределенным к началу первого выполнения пер­вого оператора головного модуля. Переопределение определен­ного объекта допускается всегда, за исключением некоторых слу­чаев для переменных типа целый (пп. 7.1.2.8, 7.1.3.2.1 и 7.2.1.1.2), а также объектов программных модулей (пп. 6.4, 8.3.2 и 8.4.2).

    1. Переменные и элементы массивов становятся опреде­ленными (или переопределенными) в следующих случаях:

завершение выполнения арифметического или логического опе­ратора присваивания вызывает определение объекта, расположен­ного слева от знака равенства;

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

завершение выполнения оператора цикла способом, приведен­ным в п. 7.1.2.8.2г, вызывает определение управляющей перемен­ной этого цикла;

начало выполнения действий, определяемых списком с циклом, вызывает определение управляющей переменной этого списка.

  1. Переменные и элементы массивов становятся неоп­ределенными в следующих случаях:

в момент завершения оператора цикла способом, приведенным в п. 7.1.2.8.2г, управляющая переменная этого цикла становится неопределенной;

завершение выполнения оператора предписания вызывает не­определенность переменной, входящей в этот оператор;

при выполнении модулей-функций некоторые объекты (п. 10.2.9) могут стать неопределенными;

завершение выполнения действий, определяемых списком с цик­лом, вызывает неопределенность управляющей переменной этого списка;

когда объект, связанный с данным объектом и имеющий иной тип, становится определенным;

когда объект, связанный с данным объектом и имеющий та­кой же тип, становится неопределенным.

  1. Объекты непомеченного общего блока. Объекты не­помеченного общего блока и связанные с ним объекты не могут быть начально определены.

Такие объекты, ставшие однажды определенными по любому из приведенных выше правил, остаются определенными до тех пор, пока не станут неопределенными в соответствии с этими же правилами.

  1. Объекты помеченного общего блока. Объекты помечен­ного общего блока и связанные с ним объекты могут быть на­чально определены.

Говорят, что программный модуль содержит имя помеченного общего блока, если это имя встречается в этом программном мо­дуле в качестве имени блока. Если программный модуль содер­жит имя помеченного общего блока, то любой объект этого бло­ка (и связанные с ним объекты), ставшие однажды определенны­ми по любому из приведенных в п. 10.2.3 правил, остаются опре­деленными до тех пор, пока не станут неопределенными в со­ответствии с этими же правилами.

Необходимо заметить, что переопределение начально опреде­ленного объекта не означает, что этот объект не может впослед­ствии стать неопределенным. Особо отметим, что если в некото­ром программном модуле содержится имя помеченного общего блока, не содержащееся ни в одном программном модуле, прямо или косвенно ссылающемся на этот модуль, то выполнение опера­тора возврата этого модуля вызывает неопределенность всех объ­ектов данного блока и связанных с ними объектов, за исключе­нием начально определенных объектов, сохраняющих свои началь­но определенные значения.

  1. Объекты не из общего блока. Любой объект не из об­щего блока, кроме формального параметра или значения функции, может быть начально определен.

Такие объекты, ставшие однажды определенными по любому из приведенных выше правил, остаются определенными до тех пор, пока не станут неопределенными в соответствии с этими же правилами.

Если такой объект используется в программном модуле, то завершение выполнения оператора возврата этого модуля вызы­вает неопределенность всех таких объектов и связанных с ними в этот момент объектов (за исключением начально определенных, которые не были переопределены и не стали неопределенными). В связи с этим необходимо подчеркнуть, что связь между фор­мальными и фактическими параметрами прекращается в момент начала выполнения оператора возврата.

Необходимо подчеркнуть, что переопределение начально опре­деленного объекта не означает, что этот объект впоследствии не может стать неопределенным.

  1. Основа. Основой в программном модуле называется последовательность, состоящая из одного или более операторов, которая определяется следующим образом.

    1. Конечными операторами основы являются:

оператор цикла;

оператор вызова подпрограммы;

оператор перехода любого типа;

условный арифметический оператор;

оператор останова;

оператор возврата;

первый из операторов (если он существует), непосредственно предшествующих оператору, метка которого употребляется в опе­раторе перехода или условном арифметическом операторе;

арифметический оператор присваивания, в котором слева от знака равенства стоит переменная типа целый;

оператор ввода, в списке которого содержится переменная ти­па целый;

условный логический оператор, содержащий любой из пере­численных выше допустимых операторов.

  1. Начальными операторами основы являются:

первый оператор в программном модуле;

первый из операторов (если он существует), непосредственно следующий за конечным оператором некоторой другой основы.

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

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

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

    1. Если при выполнении некоторой основы выполнимой программы происходит переопределение переменной типа целый, то эта переменная и все связанные с ней переменные становятся неопределенными на втором уровне во всей этой основе.

В момент выполнения начального оператора основы перемен­ная типа целый является определенной на втором уровне, если выполняются следующие условия:

в этой основе указанная переменная употребляется в индексе или вычисляемом операторе перехода;

в момент выполнения начального оператора этой основы ука­занная переменная определена на первом уровне.

  1. Такое определение сохраняется до тех пор, пока не произойдет одно из следующих событий:

завершение выполнения конечного оператора этой основы;

указанная переменная становится неопределенной или переоп­ределяется на первом уровне.

В этот момент указанная переменная становится неопределен­ной на втором уровне.

  1. Вхождение переменной типа целый в список операто­ра ввода, в котором эта переменная употребляется также и в ин­дексе, означает, что эта переменная станет определенной на вто­ром уровне. Такое определение сохранится до тех пор, пока не произойдет одно из следующих событий:

завершение выполнения конечного оператора основы, содер­жащей этот оператор ввода;

указанная переменная становится неопределенной или пере­определяется на первом уровне.

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

  1. Некоторые объекты модулей-функций. Если в пределах одного оператора встречается более одного обращения к некото­рому модулю-функции с одним и тем же списком фактических параметров, то выполнение этого модуля должно давать для всех этих случаев одни и те же результаты независимо от способа вы­полнения оператора.

Если оператор содержит множитель, который можно не вычис­лять (п. 6.4), а в этом множителе содержится ссылка на функ­цию, то все объекты, которые могли бы быть определены при вы­полнении этой ссылки на функцию, становятся неопределенными при завершении вычисления выражения, содержащего этот мно­житель.

  1. Требования определенности используемых объектов. Лю­бая переменная, употребляемая в индексе или вычисляемом опе­раторе перехода, должна быть определена на втором уровне в момент ее использования.

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

Любая переменная, употребляемая в качестве начального па­раметра, конечного параметра или параметра приращения в опе­раторе цикла или списке с циклом, должна быть определена в мо­мент ее использования.

Любая переменная, употребляемая для идентификации устрой­ства ввода/вывода, должна быть определена в момент ее использования.

В момент выполнения оператора возврата в модуле-функции значение (п. 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