我的一些fortran子程序传递了大量的输入,有时甚至是30或40.其原因有两个,首先,这些子程序有许多明确直接相关的子程序,需要将这些变量作为输入,第二,避免定义全局变量,并且解决方案似乎是每次都明确地将每个变量传递给子例程。
这对我来说似乎是不可接受的,但我真的没有解决方案,我不是百分之百确定这是一个问题,也许这是用这种语言做事的正确方法
我的问题是:这是一个问题吗?如果是,是否有更好的方法来管理这种语言的范围,而不必引入对象?
答案 0 :(得分:4)
我可以看到设计师为什么要避免全局变量。我必须处理采用相反方法的代码,几乎没有参数,并且在各种模块中一切都处于全局状态,并且它很糟糕,无论它们在only
中使用use
子句多少}陈述。
我们可以有把握地说,这一论点(比如30)太大了。所有代码风格指南都可能与此一致。使用LAPACK所需的许多参数库通常有点不愉快,而且这一点远远不及30。
Fortran 90和更新版本有几种方法可以减少参数的数量。
首先,您可以将逻辑相关的变量耦合到派生类型
type particle
integer :: species
real :: mass
real :: x, y, z
real :: vx, vy, vz
...
end type
其次,通过使用假定的形状数组,您可以避免传递数组维度。这允许现代LAPACK接口具有明显更少的参数,例如(Netlib和MKL接口)。
subroutine sub(A, NX, NY, NZ)
integer :: NZ, NY, NZ
real :: A(NX, NY, NZ)
VS
subroutine sub(A)
real :: A(:,:,:)
此更改需要显式的过程接口,因此在实践中必须将过程移动到模块中。
这些变化都是相当重大的变化,需要对大型遗留代码进行大量重构。