End interface

Interface

Интерфейсы

Enddo

Implicit none

Enddo

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

Совпадение имен формального и фактического параметров не требуется.

Пример соответствия фактических и формальных параметров:

В функции вычислить среднее арифметическое значение N последних элементов одномерного вещественного массива. В главной программе применить функцию к строкам матрицы из 10 строк и 7 столбцов, считая количество элементов для усреднения N = 5. Результаты записать в одномерный массив.

real function Average(Array, Len, N)

! заголовок функции; возвращаемое значение вещественного типа

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

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

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

integer, intent(in) :: Len ! длина одномерного массива

integer, intent(in) :: N ! кол-во последних элементов

integer :: i ! локальная переменная

real :: summa ! локальная переменная

real, dimension(1:Len), intent(in) :: Array ! массив

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

summa = 0

do i = Len-N+1, Len

summa = summa + Array(i)

Average = summa/N ! возвращаемое значение

end function Average

В главной программе:

program Main

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

real, dimension(1:10, 1:7) :: Array ! исходная матрица

real, dimension(1:10) :: Result ! результирующий массив

! локальные переменные

integer :: N=5 ! количество элементов для усреднения

integer :: i

real Average

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

do i = 1, 10

Result(i) = Average(Array(i, :), 7, N)

end program Main

Здесь в качестве фактического параметра функции – одномерного массива – используется секция двумерного массива (строка с номером i)

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

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

Сделать неявный интерфейс явным можно, описав его в интерфейсном блоке:

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

описание формальных параметров

оператор end процедуры

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

При наличии интерфейса процедуры ошибки обращения к ней обнаруживаются уже на этапе компиляции.

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

subroutine Primer(Matrix, Yes, Ar, Geom) ! заголовок

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

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

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

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

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

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

! локальные переменные и массив

integer:: i, j ! переменные циклов

real:: Summa, Prod ! сумма и произведение эл-тов матрицы

integer:: cPos ! количество положительных эл-тов матрицы

integer, dimension(1:2):: Shape_Matr ! форма массива Matrix

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

Shape_Matr= shape(Matrix) ! форма массива Matrix

Summa = 0; Prod = 1; cPos = 0

do i = 1, Shape_Matr(1) ! цикл по строкам

do j = 1, Shape_Matr(2) ! цикл по столбцам

if(Matrix(i, j) > 0) then ! подсчет суммы и произведения

cPos = cPos + 1

Summa = Summa + Matrix(i, j)

Prod = Prod * Matrix(i, j)