Как вызвать внутреннюю функцию подпрограммы в модуле?
у меня есть модуль, который содержит подпрограмму, которая в свою очередь содержит функцию. Я говорю use themodule
в моей основной программе, и я могу call thesubroutine
, но как получить доступ к функции, содержащейся в подпрограмме?
код выглядит так:
module useful
integer, parameter :: N=2
double precision, parameter :: xmin=1, xmax=10, pi=3.1415926535898
double complex :: green(N,N), solution(N), k=(2.0,0.0)
contains
subroutine y(n1)
contains
function x(n1)
real :: n1, x
x=n1*(xmax-xmin)/N
end function x
end subroutine y
end module useful
4 ответов
чтобы уточнить ответ, данный M. S. B., разделите свой код следующим образом, отметив, как функция x() была извлечена из подпрограммы y (), и есть только один оператор "contains" для отделения объявлений переменных уровня модуля от объявлений функции/подпрограммы:
module useful
integer, parameter :: N=2
double precision, parameter :: xmin=1, xmax=10, pi=3.1415926535898
double complex :: green(N,N), solution(N), k=(2.0,0.0)
contains
subroutine y(n1)
real :: n1
! Here you can do something like:
! print 'F8.3', x(n1)
end subroutine y
function x(n1)
real :: n1, x
x=n1*(xmax-xmin)/N
end function x
end module useful
Как указывает M. S. B., x() и y() находятся в одной области, поэтому вам не нужно ничего особенного делать, чтобы вызвать x () из y ().
вы не должны содержать функцию внутри подпрограммы. Есть функция после функции. Просто имейте столько процедур (подпрограмм и функций) в модуле, сколько вам нужно. Начните каждый с подпрограммы или оператора функции и завершите их соответствующим оператором end. Не помещайте их друг в друга ... вместо этого, один за другим. Имейте только модуль содержит оператор. Затем "используйте" этот модуль из вашей основной программы или из процедуры за пределами модуль.
подпрограммы и функции в модуле также доступны друг для друга. Нет необходимости использовать "contains".
некоторые дополнительные замечания. Вы можете поместить функцию внутри подпрограммы, если эта функция используется только этой подпрограммой. В этом случае вложение функций является полезным понятием.
Если вы хотите скрыть некоторые функции в модуле для внешней программы (навсегда), вы объявляете эти скрытые функции как частные в своем модуле.
Я.е
module useful
public y,x ! shall be accessible by "use useful" statement in external program
private ! anything else declared in the module is hidden for external program
integer, parameter :: N=2
!...
contains
subroutine y(n1)
end subroutine y
function x(n1)
end function x
end module useful
использование public и private помогает избежать ошибок с загрязнением пространства имен с помощью заявления
use useful, only: y,x
use useful2, only: x,y,z
use useful3, only: x2,x3,x4