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)