如何调用模块中子程序内部的函数?

时间:2011-01-08 08:42:03

标签: fortran

我有一个包含子程序的模块,该子程序又包含一个函数。我在主程序中说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 个答案:

答案 0 :(得分:10)

您不应该在子例程中包含该函数。子程序后有功能。根据需要在模块中安装尽可能多的过程(子程序和功能)。使用子例程或函数语句启动每个子例程,并以相应的结束语句结束它们。不要把它们嵌在彼此里面......相反,一个接一个。只有模块包含声明。然后从主程序中“使用”该模块,或从模块外部的程序中“使用”。

模块中的子程序和功能也可以相互访问。无需使用“包含”。

答案 1 :(得分:4)

为了澄清MSB给出的答案,按如下方式拆分代码,注意如何从子例程y()中提取函数x(),并且只有一个'contains'语句将模块级变量声明与函数分开/ subroutine声明:

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()在同一范围内,因此从y()调用x()不需要做任何特殊处理。

答案 2 :(得分:4)

其他一些评论。 如果此子函数仅使用此函数,则可以将该函数放在子例程中。在这种情况下,嵌套函数是一个有用的概念。

如果要隐藏外部程序模块中的某些功能(永远),则在模块中将这些隐藏功能声明为私有。

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

答案 3 :(得分:0)

要从子程序x调用函数y,请写

public :: x

(右)在contains之前。