我有一个包含子程序的模块,该子程序又包含一个函数.我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
Run Code Online (Sandbox Code Playgroud)
M. *_* B. 10
您不应该在子例程中包含该函数.子程序后有功能.根据需要在模块中包含尽可能多的过程(子程序和函数).使用子例程或函数语句启动每个子例程,并以相应的结束语句结束它们.不要把它们嵌在彼此里面......相反,一个接一个.只有模块包含声明.然后从主程序中"使用"该模块,或从模块外部的程序中"使用"该模块.
模块中的子程序和函数也可以相互访问.无需使用"包含".
小智 5
一些补充说明。如果该函数仅由该子例程使用,则可以将该函数放在子例程中。在这种情况下,嵌套函数是一个有用的概念。
如果您想(永远)为外部程序隐藏模块中的某些函数,则可以在模块中将这些隐藏函数声明为私有。
IE
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
Run Code Online (Sandbox Code Playgroud)
使用 public 和 private 可以帮助您避免使用语句污染命名空间的错误
use useful, only: y,x
use useful2, only: x,y,z
use useful3, only: x2,x3,x4
Run Code Online (Sandbox Code Playgroud)
为了澄清 MSB 给出的答案,请按如下方式拆分代码,注意如何从子例程 y() 中提取函数 x(),并且只有一个“包含”语句将模块级变量声明与函数/子例程声明分开:
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
Run Code Online (Sandbox Code Playgroud)
正如 MSB 指出的,x() 和 y() 位于同一范围内,因此从 y() 调用 x() 不需要执行任何特殊操作。