Параметры процедур
Пример подпрограммы
Написать подпрограмму, меняющую местами первую и последнюю строки вещественной матрицы.
subroutine Transform(Matrix, cRows, cCols) ! заголовок
! операторы описания:
implicit none! оператор должен быть в каждой программной единице
! формальные параметры
integer :: cRows, cCols! количество строк и столбцов массива
real, dimension(1:cRows, 1:cCols)::Matrix ! матрица
! локальный временный массив для одной строки:
real, dimension(1:cCols):: Temp
! исполняемые операторы:
cRows = size(Matrix,1) ! количество строк матрицы
Temp = Matrix(1, :) ! первая строка матрицы
Matrix(1, :) = Matrix(cRows, :) ! последняя строка на место первой
Matrix(cRows, :) = Temp ! первая строка на место последней
end subroutine Transform
В главной программе:
integer, parameter:: cR = 6, cCol = 8
real, dimension(1:cR, 1:cCol) :: Array
. . .
call Transform(Array, cR, cCol)
В подпрограмме используется временный локальный массив Temp, длина которого равна длине строки матрицы (cCols). Память для этого массива выделяется динамически при выполнении подпрограммы.
Рассмотрим подробнее способ передачи данных между вызывающей программной единицей и процедурой через параметры. В этом случае в заголовке процедуры указывается список формальных параметров. Формальными параметрами могут быть переменные и массивы, а также имена функций.
В операторах вызова процедуры указывается список фактических параметров. В отличие от формальных параметров, фактическими параметрами могут быть:
- переменные;
- массивы;
- имена функций;
- элементы массивов;
- секции массивов;
- константы – только входные параметры;
- выражения – только входные параметры.
Каждый параметр процедуры имеет следующие основные характеристики:
- тип;
- ранг – размерность или количество измерений; ранг переменной равен 0;
- назначение параметра – входной, выходной или универсальный (изменяемый).
Назначение формального параметра определяет атрибут intent.
Пример.
subroutine Transform(N, Pin, Result) ! заголовок
! операторы описания:
implicit none! оператор должен быть в каждой программной единице
integer, intent(in):: N ! входной параметр
real, intent(out) :: Pin ! выходной параметр
! Result – изменяемый параметр – одномерный массив:
real, dimension(:), intent(inout) :: Result
Атрибут intent(in) в описании параметра определяет параметр как входной: такой параметр не должен изменяться во время работы подпрограммы.
Атрибут intent(out) определяет параметр как выходной, то есть параметр должен быть переопределен в процедуре, поэтому при входе в подпрограмму он переходит в состояние неопределенности. Соответствующий фактический параметр не может быть константой или выражением.
Универсальные параметры описываются с атрибутом intent(inout). Предполагается, что значение универсального параметра может быть переопределено, поэтому соответствующий фактический параметр не может быть константой или выражением.