Как вызвать функцию, внутреннюю для подпрограммы в модуле? - PullRequest
7 голосов
/ 08 января 2011

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

10 голосов
/ 08 января 2011

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

Подпрограммы и функции в модуле также доступны друг другу.Нет необходимости использовать «содержит».

4 голосов
/ 16 января 2011

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

Если вы хотите скрыть некоторые функции в модуле для внешней программы (навсегда), вы объявляете эти скрытые функции как частные в вашем модуле.

т. Е.

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

, используя общедоступные и приватные, поможет вам избежать ошибок с загрязнением вашего пространства имен, используя выражения

use useful, only: y,x

use useful2, only: x,y,z

use useful3, only: x2,x3,x4
4 голосов
/ 10 января 2011

Чтобы уточнить ответ, данный MSB, разделите ваш код следующим образом, отметив, как функция x () была извлечена из подпрограммы y (), и есть только один оператор «Содержит», чтобы отделить объявления переменных уровня модуля от функции./ Подпрограмма объявлений:

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

Как указывает MSB, x () и y () находятся в одной области видимости, поэтому нет ничего особенного, что вам нужно сделать, чтобы вызвать x () из y ().

0 голосов
/ 29 декабря 2012

Чтобы вызвать функцию x из подпрограммы y, напишите

public :: x

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...