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

8

我有一个模块,其中包含一个子程序,该子程序又包含一个函数。我在主程序中使用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个回答

9
不应该在子程序内部包含函数,应该将函数放在子程序之后。在模块中只需要有尽可能多的过程(子程序和函数),每个过程以子程序或函数语句开头,并以相应的结束语句结尾。不要嵌套它们...而是一个接一个地放置。只需要模块包含语句。然后从您的主程序或模块外的过程中“使用”该模块。
模块中的子程序和函数也可以相互访问,无需使用“contains”。

5

一些额外的注释。

如果这个函数只被这个子程序使用,你可以将函数放在子程序内部。在这种情况下,嵌套函数是一个有用的概念。

如果你想要将模块中的某些函数对外部程序隐藏(永久性),你可以在模块中将这些函数声明为私有。

例如:

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

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()在同一作用域内,因此您无需特别操作即可从y()中调用x()。

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

contains之前的(right)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接