公共块和子程序参数
Common block and subroutine argument
如果我有一个名为 var
的变量,它位于名为 myCB
的公共块中,我可以使用相同的名称在其他两个未使用公共块的子例程之间传递参数 myCB
?
代码如下
Subroutine SR1(Var)
!something here using Var
end Subroutine SR1
Subroutine SR2()
....
Call SR1(B)
....
end Subroutine SR2
Subroutine SR3()
common \myCB\ Var
...
! something using the other Var shared with SR4
......
end Subroutine SR3
Subroutine SR4()
common \myCB\ Var
....
... ! something using the other Var shared with SR3
....
end Subroutine SR4
我确实遇到 Var
在 SR1
和 SR2
之间传递的问题,问题可能来自公共块中另一个名为 Var
的问题吗?
如果您不想过多修改遗留代码库,我建议您将 common
块放在 module
中,并在需要访问时导入变量:
module myCB_mod
common /myCB/ var, var2, var3
save ! This is not necessary in Fortran 2008+
end module myCB_mod
subroutine SR2()
use myCB_mod
!.......
call SR1(B)
!.....
end subroutine SR2
subroutine SR3()
use myCB_mod
!.......
end subroutine SR3
subroutine SR4()
use myCB_mod
!.....
end subroutine SR4
或者更好的是,我建议您完全避免 common
块(这需要完全重写遗留代码库)并将所有子例程限制在 module
中
module myCB
implicit none
real var, var2, var3
save ! This is not necessary in Fortran 2008+
end module myCB
module mySubs
use myCB
implicit none
contains
subroutine SR2()
!.......
call SR1(B)
!.....
end subroutine SR2
subroutine SR3()
!.......
end subroutine SR3
subroutine SR4()
!.....
end subroutine SR4
end module
最后,common
块中的变量是否需要初始化?如果是这样,这会引入更复杂的情况,涉及 data
语句甚至 block data
结构。
如果我有一个名为 var
的变量,它位于名为 myCB
的公共块中,我可以使用相同的名称在其他两个未使用公共块的子例程之间传递参数 myCB
?
代码如下
Subroutine SR1(Var)
!something here using Var
end Subroutine SR1
Subroutine SR2()
....
Call SR1(B)
....
end Subroutine SR2
Subroutine SR3()
common \myCB\ Var
...
! something using the other Var shared with SR4
......
end Subroutine SR3
Subroutine SR4()
common \myCB\ Var
....
... ! something using the other Var shared with SR3
....
end Subroutine SR4
我确实遇到 Var
在 SR1
和 SR2
之间传递的问题,问题可能来自公共块中另一个名为 Var
的问题吗?
如果您不想过多修改遗留代码库,我建议您将 common
块放在 module
中,并在需要访问时导入变量:
module myCB_mod
common /myCB/ var, var2, var3
save ! This is not necessary in Fortran 2008+
end module myCB_mod
subroutine SR2()
use myCB_mod
!.......
call SR1(B)
!.....
end subroutine SR2
subroutine SR3()
use myCB_mod
!.......
end subroutine SR3
subroutine SR4()
use myCB_mod
!.....
end subroutine SR4
或者更好的是,我建议您完全避免 common
块(这需要完全重写遗留代码库)并将所有子例程限制在 module
module myCB
implicit none
real var, var2, var3
save ! This is not necessary in Fortran 2008+
end module myCB
module mySubs
use myCB
implicit none
contains
subroutine SR2()
!.......
call SR1(B)
!.....
end subroutine SR2
subroutine SR3()
!.......
end subroutine SR3
subroutine SR4()
!.....
end subroutine SR4
end module
最后,common
块中的变量是否需要初始化?如果是这样,这会引入更复杂的情况,涉及 data
语句甚至 block data
结构。