Внутренние процедуры
Внутренние процедуры, в отличие от внешних, не могут содержать собственных внутренних процедур и имеют вид:
Заголовок процедуры
[Операторы описания]
[Исполняемые операторы]
Оператор end процедуры
Текст внутренней процедуры включается в текст вызывающей ее программы после всех исполняемых операторов этой программы. Оператор contains отделяет исполняемые операторы внешней программы от описания внутренних процедур. Во внешнюю программу после оператора contains может быть вложена одна или несколько внутренних процедур.
Внутренняя процедура, будучи вложенной во внешнюю программу, не является самостоятельной и импортирует обозначения программы-носителя, поэтому может компилироваться только в составе внешней программной единицы.
Все обращения к внутренним процедурам могут производиться только из компонента-носителя. Обмен данными с внутренними процедурами может происходить не только через параметры подпрограмм, но и путем заимствования их у программы-носителя.
Среди внутренних процедур различаются процедуры-функции functionи процедуры-подпрограммыsubroutine.
Пример внутренней процедуры-функции:
program main
Implicit none
real :: x=0.7555, y=6.573
write(*,*) ‘result of inner_func =’, inner_func
Contains
real function inner_func ! внутренняя подпрограмма-функция
inner_func = sqrt(x**2 + Y**2)
end function inner_func
end program main
Здесь данные для внутренней процедуры-функции inner_func заимствованы у программы-носителя main.
Интерфейс внутренней процедуры всегда известен в области ее использования: компонент-носитель знает все о параметрах внутренней процедуры. Другим программным единицам внутренние процедуры недоступны. Интерфейс внутренней процедуры представляет собой образец явного интерфейса: проверить корректность обращения к ней можно еще на стадии компиляции. Другими словами, интерфейсный блок внутренним процедурам не нужен.
Встроенные функции
Другим примером явного интерфейса являются встроенные функции, такие как Sin, Sqrt, Log и другие. Эти функции также не требуют написания интерфейсного блока.
Встроенные функции являются частью языка Фортран, и их имена входят в число ключевых слов. У некоторых функций имеются необязательные и ключевые параметры.
Многие числовые встроенные функции заимствуют у аргументов форму возвращаемого значения. Такие функции называются элементными. Если аргумент – массив, то и результат – конформный массив, полученный применением функции поэлементно. Например, если Array – вещественный массив, то массив синусов его элементов можно получить одним оператором:
В = sin(Array)
Стандартные функции для работы с числами в большинстве своем являются элементными – все тригонометрические функции, преобразование типов, abs, exp, sqrt, Log и другие.
Некоторые числовые встроенные функции заимствуют у аргументов тип возвращаемого значения. Такие функции называются родовыми. Примером родовой функции может служить abs.
Модули
Если целью внутренних и внешних процедур является выполнение действий, определяемых подзадачей в рамках всей программы (внешние процедуры) или данного программного компонента (внутренние процедуры), то задачей модуля является аккумуляция данных. Структура модуля такова:
module имя модуля
[операторы описания]
[contains
модульные процедуры]
end [module имя модуля]
Модульные процедуры могут, в свою очередь, содержать внутренние процедуры, записанные после оператора contains.
Операторы описания объектов модуля содержат атрибуты public или private, показывающие, является ли объект доступным за пределами модуля. Объекты модуля, объявленные с атрибутом private, доступны только модульным процедурам и их внутренним процедурам. Объекты модуля, объявленные с атрибутом public, заимствуются также всеми программными единицами, которые используют этот модуль: другими модулями, внешними программами и их внутренними процедурами.
По умолчанию все объекты модуля имеют атрибут public.
Пример 1
module array
real, dimension(1:20), public :: A
end module array
Модульные процедуры имеют структуру внешних программ. Они также имеют атрибут public, и их можно вызывать из используемого модуля. В то же время их внутренние процедуры недоступны в программной единице, использующей модуль.
Вызов модульной процедуры не требует блока interface.
При совместной компиляции модуля и использующих его программных единиц модуль должен компилироваться первым.
Модуль включается в каждый программный компонент, где этот модуль используется, оператором use. Оператор use пишется сразу после заголовка программной единицы:
use module имя модуля
Например, если несколько программных единиц включают в себя модуль array из примера 1 с помощью оператора
use module array
то массив A из этого модуля доступен во всех этих программных единицах.
Дата добавления: 2017-09-19; просмотров: 694;