Как вызвать внутреннюю функцию подпрограммы в модуле?

у меня есть модуль, который содержит подпрограмму, которая в свою очередь содержит функцию. Я говорю 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

для вызова функции x из подпрограммы y пишите

public :: x

(справа) перед contains.