Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 5.doc
Скачиваний:
7
Добавлен:
20.03.2016
Размер:
217.6 Кб
Скачать

Interface

subroutine Primer(Matrix, Yes, Ar, Geom) ! заголовок процедуры

implicit none ! оператор должен быть в каждой программной единице

! формальные параметры

real, dimension(:,:), intent(in) :: Matrix ! матрица

logical, intent(out) :: Yes ! признакесть эл-ты >0

real, intent(out) :: Ar, Geom ! средние значения

end subroutine Primer

end interface

! исполняемые операторы:

. . .

call Primer(Array, YesPlus, Ar, Geom)

if (YesPlus) then

. . . ! печать результатов

endif

end

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

Среди исполняемых операторов подпрограммы с помощью функции shapeопределяется форма массива-параметра – одномерный массив Shape_Matr. Протяженности массива по измерениям равныShape_Matr(1)(количество строк матрицы) иShape_Matr(2)(количество ее столбцов).

Внутренние процедуры

Внутренние процедуры, в отличие от внешних, не могут содержать собственных внутренних процедур и имеют вид:

Заголовок процедуры

[Операторы описания]

[Исполняемые операторы]

Оператор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.

Пример

module array

real, dimension(1:20), public :: A

end module array

Модульные процедуры имеют структуру внешних программ. Они также имеют атрибут public, и их можно вызывать из используемого модуля. В то же время их внутренние процедуры недоступны в программной единице, использующей модуль. Вызов модульной процедуры не требует блокаinterface.

Модуль включается в другие программные компоненты оператором use,который пишется сразу после заголовка программной единицы:

use moduleимя модуля