— массив и элементы этого массива;
— переменная;
— внутренняя функция;
— встроенная функция;
— внешняя функция;
— подпрограмма.
(Измененная редакция, Изм. № 1).
. Соотношения между классами. Если в программном модуле символическое имя из класса V встречается непосредственно после слова FUNCTION в заголовке функции, то оно обязано принадлежать также классу II того же программного модуля.
Символическое имя, будучи использовано однажды в любом программном модуле выполнимой программы в классе V или VI, не может употребляться ни в каком другом программном модуле этой выполнимой программы для обозначения другого объекта из этих классов.
В любом программном модуле никакое символическое имя не может принадлежать более чем одному классу, за исключением перечисленных выше случаев. На использование символических имен в разных модулях не накладывается никаких дополнительных ограничений.
. Эффект употребления символических имен в объявлениях спецификаций. Символическое имя принадлежит классу I тогда и только тогда, когда оно употребляется в описании массива в качестве имени описания. Для каждого символического имени в одном модуле допускается только одно такое употребление.
Символическое имя, употребляемое в объявлении общих объектов, принадлежит либо классу I, либо классу II, но не классу V (п. 8.3.1). Для каждого символического имени в одном модуле допускается только одно такое употребление.
Символическое имя, употребленное в объявлении эквивалентности, принадлежит либо классу I, либо классу II, но не классу V (п. 8.3.1).
. Массив и элемент массива. За каждым вхождением символического имени, обозначающего какой-либо массив, должен непосредственно располагаться индекс; исключение составляют следующие вхождения:
в список оператора ввода/вывода;
в список формальных параметров;
в список фактических параметров при ссылке на внешнюю процедуру;
в объявление общих объектов.
Формальный параметр внешней процедуры может быть именем массива только в том случае, когда соответствующий фактический параметр при ссылке на эту внешнюю процедуру является именем массива. Если фактический параметр является именем массива, то длина массива — формального параметра должна быть не больше длины массива — фактического параметра.
. Внешние процедуры. При выполнении любой выполнимой программы не допускаются два таких обращения к одному и тому же модулю-процедуре, между которыми не был бы выполнен оператор возврата из этого модуля.
. Подпрограмма. Символическое имя принадлежит классу VI, если оно встречается непосредственно после слова SUBROUTINE в заголовке подпрограммы или непосредственно после слова CALL в операторе вызова подпрограммы.
. Внутренняя функция. Символическое имя принадлежит классу III в некотором программном модуле, если оно:
не принадлежит ни классу I, ни классу IV;
за каждым его вхождением непосредственно следует левая скобка;
в рассматриваемом модуле имеется объявление внутренней функции (п. 8.1.1) с этим именем.
. Встроенная функция. Символическое имя принадлежит классу IV в некотором программном модуле, если оно:
встречается в колонке имен табл. 3;
за каждым его вхождением непосредственно следует левая скобка.
Употребление встроенной функции в некотором программном модуле не запрещает использования этого же символического имени для обозначения какого-либо другого объекта в другом программном модуле той же выполнимой программы.
. Внешняя функция. Символическое имя принадлежит классу V, если оно:
встречается непосредственно после слова FUNCTION в заголовке функции;
не принадлежит ни одному из классов I, III, IV или VI и имеется хотя бы оно его вхождение, непосредственно за которым следует левая скобка. Левая скобка должна непосредственно следовать за каждым его вхождением.
( Измененная редакция, Изм. № 1).
. Переменная. В программном модуле символическое имя принадлежит классу II, если оно:
не принадлежит классу VI;
за ним никогда непосредственно не следует левая скобка, если только это имя не следует непосредственно за словом FUNCTION в заголовке функции.
. Имя блока — отсутствует; определение—по ГОСТ 23056—78.
Понятие определения. Для числовых величин существует два уровня определения — первый и второй. Понятие определения на первом уровне применимо к любым элементам массивов и переменным; понятие определения на втором уровне — только к переменным типа целый. Для объяснения смысла этих понятий необходимо рассмотреть выполнимую программу в процессе ее выполнения.
Необходимо отметить, что существует другой способ определения, позволяющий ссылаться на внешнюю процедуру. Он будет рассмотрен в п. 10.2.1.
В дальнейшем, говоря об определении и неопределении применительно к переменным и элементам массивов, мы всегда будем подразумевать первый уровень определения.
Определение процедур. Если выполнимая программа содержит информацию, описывающую внешнюю процедуру, то такая внешняя процедура с соответствующим символическим именем определена для использования в этой выполнимой программе. Ссылка на внешнюю функцию или ссылка на подпрограмму (выбирается подходящий случай) с этим символическим именем может встречаться в выполнимой программе, если число параметров в определении и ссылке совпадает. Остальные ограничения содержаться в пп. 8.3.1, 8.3.2, 8.4.1, 8.4.2 и 10.1.3.
Основные внешние функции, перечисленные в п. 8.3.3, определены всегда и на них можно ссылаться при условии выполнения ограничений, указанных выше.
Для указанного использования определено символическое имя из класса III или IV.
Связи, обеспечивающие определение. Объекты могут стаДь связанными посредством:
связи через общий блок;
связи через эквивалентность;
подстановки параметров.
В результате упомянутых комбинаций может возникнуть множественная связь с одним или несколькими объектами. Любое определение или неопределение одного из элементов множества связанных элементов вызывает определение или неопределение всех элементов этого множества.
С точки зрения определения в любом программном модуле между двумя объектами, каждый из которых встречается в объявлении общих объектов, не существует никакой связи. Кроме того, для общих и эквивалентных объектов не существует никакой связи, кроме установленной в пп. 7.2.1.3.1 и 7.2.1.4.
Если фактический параметр при ссылке на внешнюю процедуру является именем массива, именем элемента массива или именем переменной, то в соответствии с пп. 10.1.3 и 10.2.1 связь формальных параметров с фактическими определена лишь на время от начала выполнения первого оператора этой процедуры и до начала выполнения первого встреченного оператора возврата этой процедуры. Заметим особо, что эта связь может передаваться более чем через один уровень ссылок на внешние процедуры.
В дальнейшем переменные и элементы массивов, связанные на основании пп. 7.2.1.3.1 и 7.2.1.4, будут считаться эквивалентными только при условии совпадения типов.
Если объект данного типа становится определенным, то в этот же момент все связанные с ним объекты иного типа становятся неопределенными, а все связанные с ним объекты того же самого типа становятся, если не оговорено противное, определенными.
Связь подстановкой параметров допускается лишь при совпадении типов, причем правило таково: объект, порожденный подстановкой параметров, определен в момент входа (в процедуру) только в том случае, если был определен фактический параметр. Если объект, порожденный подстановкой параметров, при выполнении программного модуля становится (пока связь существует) определенным или неопределенным, то существующие фактические объекты во всех вызывающих программных модулях становятся соответственно определенными или неопределенными.
События, обеспечивающие определение. Любой объект является неопределенным к началу первого выполнения первого оператора головного модуля. Переопределение определенного объекта допускается всегда, за исключением некоторых случаев для переменных типа целый (пп. 7.1.2.8 и 7.1.3.2.1), а также объектов программных модулей (пп. 5.4, 8.3.2 и 8.4.2).
Переменные и элементы массивов становятся определенными (или переопределенными) в следующих случаях:
завершение выполнения арифметического оператора присваивания вызывает определение объекта, расположенного слева от знака равенства
;при выполнении оператора ввода каждый объект, которому присваивается значение соответствующего типа из внешней среды ввода, становится определенным в момент этого присваивания. Связанные объекты одинакового типа становятся определенными лишь по завершении выполнения этого оператора ввода;
завершение выполнения оператора цикла способом, приведенным в п. 7.1.2.8.2е, вызывает определение управляющей переменной этого цикла;
начало выполнения действий, определяемых списком с циклом, вызывает определение управляющей переменной этого списка.
Переменные и элементы массивов становятся неопределенными в следующих случаях:
в момент завершения оператора цикла способом, приведенным в п. 7.1.2.8.2 г, управляющая переменная этого цикла становится неопределенной;
завершение выполнения действий, определяемых списком с циклом, вызывает неопределенность управляющей переменной этого списка;
когда объект, связанный с данным объектом и имеющий иной тип, становится определенным;
когда объект, связанный с данным объектом и имеющий такой же тип, становится неопределенным.
Объекты непомеченного общего блока — отсутствует; определение — по ГОСТ 23056—78.
Объекты помеченного общего блока — отсутствует; определение — по ГОСТ 23056—78.
Объекты не из общего блока. Любой объект не из общего блока начально неопределен.
Такие объекты, ставшие однажды определенными по любому из приведенных выше правил, остаются определенными до тех пор, пока не станут неопределенными в соответствии с этими же правилами.
Если такой объект используется в программном модуле, то завершение выполнения оператора возврата этого модуля вызывает неопределенность всех таких объектов и связанных с ними в этот момент объектов.
Необходимо подчеркнуть, что связь между формальными и фактическими параметрами прекращается в момент начала выполнения оператора возврата.
Основа. Основой в программном модуле называется последовательность, состоящая из одного или более операторов и определяемая следующим образом.
Конечными операторами основы являются:
оператор цикла;
оператор вызова подпрограммы;
оператор перехода любого типа;
условный арифметический оператор;
оператор останова;
оператор возврата;
первый из операторов (если он существует), непосредственно предшествующих оператору, метка которого употребляется в операторе перехода или условном арифметическом операторе;
арифметический оператор присваивания, в котором слева от знака равенства стоит переменная типа целый;
оператор ввода, в списке которого содержится переменная типа целый.
Начальными операторами основы являются:
первый оператор в программном модуле;
первый из операторов (если он существует), непосредственно следующий за конечным оператором некоторой другой основы.
Каждый начальный оператор основы задает некоторую основу. Если этот начальный оператор является также и конечным оператором основы, то она состоит лишь из одного этого оператора. Если же это не так, то основа состоит из начального оператора и всех последующих операторов до конечного оператора основы включительно.
Последний оператор. В любом программном модуле последний по порядку оператор должен быть либо оператором перехода, либо условным арифметическим оператором, либо оператором останова, либо оператором возврата.
Второй уровень определения. В момент использования в индексах и вычисляемых операторах перехода переменные типа целый должны быть определены на втором уровне.
Если при выполнении некоторой основы выполнимой программы происходит переопределение переменной типа целый, то эта переменная и все связанные с ней переменные становятся неопределенными на втором уровне во всей этой основе.
В момент выполнения начального оператора основы переменная типа целый является определенной на втором уровне, если выполняются следующие условия:
,в этой основе указанная переменная употребляется в индексе или вычисляемом операторе перехода;
в момент выполнения начального оператора этой основы указанная переменная определена на первом уровне.
Такое определение сохраняется до тех пор, пока не произойдет одно из следующих событий:
завершение выполнения конечного оператора этой основы;
указанная переменная становится неопределенной или переопределяется на первом уровне.
В этот момент указанная переменная становится неопределенной на втором уровне.
Вхождение переменной типа целый в список оператора ввода, в котором эта переменная употребляется также и в индексе, означает, что эта переменная станет определенной на втором уровне. Такое определение сохраняется до тех пор пока не произойдет одно из следующих событий;