Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

8. Программные единицы

тело интерфейса - задает характеристики внешних или формальных

процедур и представляет в случае функции

заголовок функции [раздел описаний]

END [FUNCTION [имя функции]]

либо в случае подпрограммы

заголовок подпрограммы [раздел описаний]

END [SUBROUTINE [имя подпрограммы]]

Оператор MODULE PROCEDURE может появляться в интерфейсном блоке, лишь когда присутствует родовое описание. При этом все процедуры списка имен процедур должны быть доступными модульными процедурами. Характеристики модульных процедур не должны появляться в интерфейсном блоке.

Процедура, объявленная в интерфейсном блоке, обладает атрибутом EXTERNAL. Она не может быть объявлена внешней посредством атрибута или оператора EXTERNAL в программной единице, в которой присутствует или доступен через use-ассоциирование интерфейсный блок с этой процедурой. Для процедуры в блоке видимости может быть задан лишь один интерфейсный блок.

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

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

Тело интерфейса не может содержать операторы ENTRY, DATA, FORMAT, объявления операторных функций. Можно, правда, задать самостоятельный ENTRY-интерфейс, использовав в теле интерфейса имя точки входа в качестве имени процедуры.

Программная единица BLOCK DATA не может содержать интерфейсный блок.

8.13. Ассоциирование имен

Большинство объектов Фортран-программы являются локальными. К ним относятся имена переменных, констант, производных типов данных, внутренних и модульных процедур, операторных функций. Глобальными

253

О. В. Бартеньев. Современный ФОРТРАН

являются имена главной программы, встроенных и внешних процедур, модулей, common-блоков, BLOCK DATA. Однако локальный объект программной единицы можно сделать доступным в другой программной единице, используя ассоциирование имен: ассоциирование параметров процедуры, use-ассоциирование и ассоциирование через носитель.

В момент вызова процедуры между формальными и фактическими параметрами устанавливается связь, или, иными словами, формальные параметры процедуры ассоциируются с фактическими. Благодаря такой связи:

осуществляется обмен данными между программными единицами;

реализуется альтернативный возврат из подпрограммы (разд. 8.19);

передается в процедуру имя внешней или встроенной функции.

Более подробно о правилах соответствия формальных и фактических параметров см. в разд. 8.11.1.

Объекты модуля становятся доступны в программной единице, если в ней есть оператор USE, содержащий имя модуля. Использование этого оператора равнозначно повторному описанию всех не имеющих атрибута PRIVATE объектов модуля внутри программной единицы с сохранением всех имен (если нет переименований) и свойств. (Доступ к объектам модуля может быть ограничен за счет использования в операторе USE опции ONLY.) В этом случае говорится, что объекты модуля доступны за счет use- ассоциирования. Благодаря use-ассоциированию может быть обеспечен доступ к следующим объектам модуля:

именованным объектам данных;

определениям производных типов;

интерфейсным блокам;

модульным процедурам;

родовым интерфейсам;

namelist-группам.

Use-ассоциирование передает как данные, так и статус объектов, например статус размещаемого массива (разд. 4.8.2).

При подключении к программной единице модулей нельзя допускать дублирования передаваемых через use-ассоциирование имен и локальных имен самой программной единицы. Однако доступные через use- ассоциирование имена могут совпадать, если:

нет ни одного использования дублированного имени;

продублированное имя является родовым (разд. 8.12).

Избежать конфликтов имен можно за счет переименования, использования опции ONLY и за счет придания атрибута PRIVATE тем объектам модуля, которые предназначены только для внутреннего использования в модуле.

254

8. Программные единицы

В модульных и внутренних процедурах доступны все объекты носителя этих процедур, в том числе и объекты, доступные носителю через use- ассоциирование. Такой механизм доступа к объектам носителя называется

ассоциированием через носитель. Общее правило таково: имя объекта носителя считается повторно описанным с теми же свойствами в модульной или внутренней процедуре при условии, что в процедуре нет другого объекта с таким же именем, объявленного локально, или доступного путем use-ассоциирования, или являющегося локальным формальным параметром или результирующей переменной.

Пример:

real :: x = 1.0, w = 1.0, z = 1.0

 

call decar(x)

 

print '(3f5.2)', x, w, z

! 5.0 1.0 5.0

contains

 

subroutine decar(x)

! Локальная переменная w подпрограммы decar

real x, w

x = 5; w = 5; z = 5

! закрывает локальную переменную w носителя

end subroutine

 

end

 

8.14. Область видимости имен

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

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

subroutine reg( )

 

integer, parameter :: m = 40, n = 20

! Область 1

real a(m, n), b(3, 4, 5)

! Область 1

type win

 

integer n

! Область 2

real a(n)

! Область 2

end type

 

interface

 

subroutine ones(a, m)

! Область 3

integer m

! Область 3

real a(:, :, :)

! Область 3

end subroutine ones

! Область 3

end interface

 

type(win) tin(n)

! Область 1

255

О. В. Бартеньев. Современный ФОРТРАН

a = real(n)

! Область 1

tin(n).a = real(m)

! Область 1

print *, a(m, n), tin(n).a(1)

! Область 1

call ones(b, n)

! Область 1

call two( )

 

contains

 

subroutine two( )

! Внутренняя подпрограмма не является областью

integer m

! видимости объектов носителя, но объекты носителя

m = n

! n, a, b, win, tin и интерфейс к подпрограмме

a = real(m)

! ones достижимы в two благодаря ассоциированию

call ones(b, m)

! через носитель. Переменная m подпрограммы

end subroutine two

! two закрывает константу m носителя

end subroutine reg

 

program t2

! Драйвер подпрограммы reg

call reg( )

 

end program t2

 

subroutine ones(a, m)

 

integer m

 

real a(:, :, :)

 

a = real(m)

 

end subroutine ones

 

В этом фрагменте область 1 является областью видимости констант m и n. Впрочем, эти же константы видны и в области 2 определения производного типа: в объявлении REAL a(n) используется константа n из области 1. В то же время в области 2 можно объявить компонент с именем n. В области 3 интерфейсного блока константы m и n, так же как и массив a(1:m, 1:n), не видны. Иными словами, использованные в областях 1, 2 и 3 имена m, n и a относятся к разным объектам данных. Таким образом, область видимости констант m и n состоит из трех блоков видимости, разделенных областью 3. Областью видимости массива a(1:m, 1:n) и трехмерного массива b являются два блока, разделенные уже двумя областями с номерами 2 и 3.

Область видимости именованного объекта зависит от вида его имени.

Имена объектов разделяются на глобальные, локальные и операторные.

Глобальными являются имена главной программы, модулей, встроенных и внешних процедур и common-блоков. Эти имена известны в любой программной единице, и не может быть двух глобальных объектов с одним именем. Так, не может быть common-блока с именем sqrt, поскольку это имя принадлежит встроенной функции.

Если же в каком-либо блоке видимости определена локальная переменная sqrt, то глобальное имя встроенной функции SQRT в этом блоке видимости становится недоступным.

256

8. Программные единицы

Если же глобальное имя встроенной процедуры определено в блоке видимости с атрибутом EXTERNAL, то встроенная процедура также становится недоступной в этом блоке видимости, но введенное имя трактуется как глобальное имя внешней процедуры.

Пример:

real :: sqrt, x = 4.0, y

! Должна быть определена внешняя функция sin

real, external :: sin

sqrt = 5.0

! Локальное имя закрывает глобальное имя

y = sqrt(x)

! Ошибка - встроенная функция SQRT недоступна

К локальным именам относятся имена переменных, формальных параметров, именованных констант, производных типов, операторных функций, внутренних, модульных и формальных процедур, родовых описаний, namelist-групп. Блоками видимости локальных имен являются:

определение производного типа;

тело интерфейса, за исключением содержащихся в нем определений производных типов и тел интерфейсных блоков;

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

Локальные имена в случае объявления их в блоке видимости закрывают имена глобальных объектов, и последние становятся недоступными в этом блоке видимости. Исключение составляют применяемые при вызове процедур ключевые слова, родовые описания и имена common-блоков. Выше было показано, как локальное имя sqrt закрыло глобальное имя встроенной функции SQRT. Такой же эффект вызовет и использование внутренней функции, например, с именем tan, которое закроет в блоке видимости имя встроенной функции TAN, например:

subroutine dehi

...

y = tan(x) ! Будет вызвана внутренняя функция tan contains

function tan(x)

...

end function tan end subroutine dehi

Областью видимости операторного имени является один оператор. Операторные имена могут появляться при задании операторной функции, а также в неявных циклах операторов DATA и конструкторов массивов. Областью видимости формальных параметров операторной функции является оператор задания этой функции. Областью видимости переменной неявного цикла, которая должна быть целого типа, является этот цикл.

257