Variables 如何在Fortran中明确使用继承变量?
我有一个关于模型/变量使用的最佳实践的问题: 假设我有一个模块,其中包含一些变量/参数定义和一些使用这些变量的子例程 我不需要在子例程中显式地使用这些变量,因为它们是从父模块继承的-但是这样做会更好吗 例如:Variables 如何在Fortran中明确使用继承变量?,variables,module,fortran,Variables,Module,Fortran,我有一个关于模型/变量使用的最佳实践的问题: 假设我有一个模块,其中包含一些变量/参数定义和一些使用这些变量的子例程 我不需要在子例程中显式地使用这些变量,因为它们是从父模块继承的-但是这样做会更好吗 例如: module test implicit none integer, parameter :: a = 1 real :: x contains subroutine idk(y,z) real, intent(in) :: y real, in
module test
implicit none
integer, parameter :: a = 1
real :: x
contains
subroutine idk(y,z)
real, intent(in) :: y
real, intent(out) :: z
if(a .eq. 1) then
z = x*y + 5.
else
z = x*y - 5.
end if
end subroutine idk
end module test
上面的示例应该可以很好地工作,但是添加
use test, only: a,x
到子例程的声明部分idk
根据我的推理,这里有两个要点:
1) Pro:显式地添加这一行,让我很容易看到子例程中实际需要哪些变量。
在许多情况下,模块包含相当多的变量,但每个子例程中只需要几个变量。因此,为了更好地理解,增加这一行将是有益的
但是
2) 相反:在相当多的情况下,您需要上面声明的许多变量/参数(有时数量超过100个参数)。在子例程的开头显式使用这些函数只会使代码变得不必要的混乱,降低代码的可读性
如果只需要包含几个变量,则第1点最重要,而只有当需要包含许多变量时,第2点才重要。但我认为对少数变量做一件事,对许多变量做另一件事是愚蠢的——一旦你选择了一个惯例,你就应该坚持下去
这方面是否有最佳实践?
补充:
或者,可以将子例程声明为
subroutine idk(b,w,y,z)
然后将其称为idk(a,x,y,z)
一方面,如果我以后决定将idk
与其他变量一起使用,这将给我更大的灵活性
另一方面,如果我以后更改某些内容,它也会增加出错的风险(比如,我意识到我不需要参数a
作为条件,而需要参数c
。在第一种情况下,我只需在子例程中切换a
->c
。但在最后一种情况下,我需要更改对idk(c,…)的每个调用
。如果这些调用太多,则很容易出错)
我非常感谢你的意见!谢谢大家! 绝对没有理由使用当前定义的模块。这是违法的。如果模块以前编译过,并且编译器可以找到
.mod
文件,但是文件是错误的,那么可能会发生编译
您应该期望出现以下错误:
ifort -c assoc.f90
assoc.f90(10): error #6928: The module-name on a USE statement in a program unit cannot be the name of any encompassing scoping unit. [TEST]
use test
------^
模块子例程通过主机关联从主机模块获取变量,use
语句用于使用关联。这是两件不同的事情,不应该混为一谈
如果要避免全局变量,请将它们作为参数传递。这是一个一般性的建议。什么是最好的取决于每个案例和程序员,通常无法回答。谢谢您的回答!由于这个原因,我从未遇到过gfortran的编译器问题(即使不存在
.mod
文件),所以我只是假设这两个文件都是允许的。我假设主机关联取代了使用关联?因此,如果我只在我的模块test
中使用一些_mod:一些_变量
,那么我不需要(也不应该)在包含的子例程idk
中再次这样做?你可以在子例程中再次这样做,但你不必这样做。假设它引用了不同的模块。Gfortran给我致命错误:无法打开模块文件'test.mod'读取(1):没有这样的文件或目录
。因此我可以将模块测试
\使用一些mod,仅:一些变量
\…
\包含子例程idk(y,z)
\只使用一些mod:一些变量
\..
这是允许的吗?某个\u变量
是否已经与idk
关联,因为它现在“包含”在测试中?是的,这是允许的。我不确定确切的标准术语,但它肯定是允许的。一旦在子例程中使用关联符号,就会隐藏它在主机模块中的任何定义。顺便说一句,另一种选择是将参数放在单独的模块中。我总是谨慎处理主机关联,并在源代码中记录它。请注意,即使您决定将必要的变量作为参数传递给内部过程,主机变量仍可能被“意外”访问/修改。我认为这比忘记将变量传递给外部子例程更糟糕,因为在这种情况下,您会立即看到错误。我考虑将参数放在单独的模块中。我的问题是:代码太大,而且我有很多参数。通过将变量声明与使用它们的主要例程放在一起,它看起来组织得很好。外包它们基本上会使模块的数量增加一倍(除非我把它们都放在一个大的控制文件中,这可能会让人很困惑,因为它确实非常大),这使得我更难找到需要的东西。但现在我很担心这会把事情搞砸。如何确保不会无意中修改主机关联变量?