2011-01-08 21 views
7

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

为了阐明MSB给出的答案,请将代码分解如下,注意函数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 

由于MSB指出,X()和Y()是在相同的范围所以没有什么特别的,你需要做的调用由Y X()()。

9

你不应该包含子例程中的功能。子程序后有功能。根据需要在模块中安装尽可能多的程序(子程序&函数)。用子程序或函数语句开始每个子程序,并用相应的结束语句结束它们。不要将它们嵌套在彼此之内......而是一个接一个。只有模块包含语句。然后从主程序或模块外的程序“使用”该模块。

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

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 
0

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

public :: x 

(右)be前contains

相关问题