我有这样的程序
program
call one()
contains one()
some vars
contains two()
use the vars of one
define its own vars
contains three()
use the vars of both one and two
这不会编译,因为Fortran只允许第一个包含语句。
我使用此设计来避免将one()
的所有变量传递并重新输入two()
和three()
。
如何重写程序以实现变量共享?
我无法在语句call one()
之前定义所有变量
代码将很难管理,我需要这个功能:
parent subroutine cannot access internal subroutine variables
。
也许解决方案是使用指针
call one(pointer_to_two)
然后在自己的模块中定义例程two()
但我觉得这个设计因我有限的Fortran技能而变得复杂
我担心它会影响性能。
我应该使用common block
吗?
我使用最新的Fortran方言和英特尔编译器。
以下是可编辑的'示例
program nested_routines
call one()
contains
subroutine one()
integer :: var_from_one = 10
print *, 1
call b()
contains
subroutine two()
integer :: var_from_two = 20
print *, 2, var_from_one
call c()
contains
subroutine three()
print *, 3, var_from_one, var_from_two
end subroutine
end subroutine
end subroutine
end module
答案 0 :(得分:3)
我建议在单个"包含"之后将您的程序(子程序和功能)放入模块中。并使用主程序中的该模块。每个过程的局部变量将隐藏其调用者。这与您的目标不同的方式是您必须重新声明变量。我不喜欢另一个子例程中所有变量的继承,因为它可能会错误地重用变量。如果您有许多在多个过程中共享的变量,那么适当的设计选择可能是使它们成为全局变量。使用Fortran> = 90时,模块变量是比公共块更好的全局变量方法。如果您在有限数量的过程之间传递变量,通常最好使用参数,因为这样可以使信息流更清晰。
答案 1 :(得分:2)
如果每个函数特定变量都有一个单独的模块,并且每个函数实现都有一个单独的模块,那么这可能是可能的
根据使用层次结构必要性
,注意模块编译的顺序另外,我不知道这样做的效果
module m1_var
implicit none
contains
end module m1_var
!========================================================================================================================
module m2_var
implicit none
contains
end module m2_var
!========================================================================================================================
module m3_var
implicit none
contains
end module m3_var
!========================================================================================================================
module m3_sub
implicit none
contains
subroutine s3()
use m2_var !to see varibles
!arguments
!local
!allocation
!implementation
end subroutine s3
end module m3_sub
!========================================================================================================================
module m2_sub
implicit none
contains
subroutine s2()
use m3_sub
use m1_var
!arguments
!local
!allocation
!implementation
call s3
end subroutine s2
end module m2_sub
!========================================================================================================================
module m1_sub
use m1_var
implicit none
contains
subroutine s1()
use m2_sub
!arguments
!local
!allocation
!implementation
! call s2
end subroutine s1
end module m1_sub
!========================================================================================================================
program nestmoduse
use m1_sub
implicit none
call s1
end program nestmoduse