如何调用模块中子程序内部的函数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调用模块中子程序内部的函数?相关的知识,希望对你有一定的参考价值。
我有一个包含子程序的模块,该子程序又包含一个函数。我在我的主程序中说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
答案
为了澄清MSB给出的答案,请按如下方式拆分代码,注意如何从子例程y()中提取函数x(),并且只有一个'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()不需要做任何特殊处理。
另一答案
您不应该在子例程中包含该函数。子程序后有功能。根据需要在模块中包含尽可能多的过程(子程序和函数)。使用子例程或函数语句启动每个子例程,并以相应的结束语句结束它们。不要把它们嵌在彼此里面......相反,一个接一个。只有模块包含声明。然后从主程序中“使用”该模块,或从模块外部的程序中“使用”该模块。
模块中的子程序和函数也可以相互访问。无需使用“包含”。
另一答案
一些额外的评论。如果此子函数仅使用此函数,则可以将该函数放在子例程中。在这种情况下,嵌套函数是一个有用的概念。
如果要隐藏外部程序模块中的某些功能(永远),则在模块中将这些隐藏功能声明为私有。
即
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
之前。
以上是关于如何调用模块中子程序内部的函数?的主要内容,如果未能解决你的问题,请参考以下文章