Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何在Fortran中明确使用继承变量?_Variables_Module_Fortran - Fatal编程技术网

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
关联,因为它现在“包含”在
测试中?是的,这是允许的。我不确定确切的标准术语,但它肯定是允许的。一旦在子例程中使用关联符号,就会隐藏它在主机模块中的任何定义。顺便说一句,另一种选择是将参数放在单独的模块中。我总是谨慎处理主机关联,并在源代码中记录它。请注意,即使您决定将必要的变量作为参数传递给内部过程,主机变量仍可能被“意外”访问/修改。我认为这比忘记将变量传递给外部子例程更糟糕,因为在这种情况下,您会立即看到错误。我考虑将参数放在单独的模块中。我的问题是:代码太大,而且我有很多参数。通过将变量声明与使用它们的主要例程放在一起,它看起来组织得很好。外包它们基本上会使模块的数量增加一倍(除非我把它们都放在一个大的控制文件中,这可能会让人很困惑,因为它确实非常大),这使得我更难找到需要的东西。但现在我很担心这会把事情搞砸。如何确保不会无意中修改主机关联变量?