在Fortran中使用另一个模块中的参数名称声明一个数组

Pu *_*ang 3 arrays fortran

我在Fortran世界里很新.我得到了一段代码,在那里我发现很难理解它.

假设在模块A中,var声明为整数类型的参数:

integer, parameter :: var = 81
Run Code Online (Sandbox Code Playgroud)

然后在另一个模块B中,声明一个名称var为的数组:

integer :: var(2)
Run Code Online (Sandbox Code Playgroud)

当这些模块用于第三个模块C时:

use A
use B
Run Code Online (Sandbox Code Playgroud)

这些名字不会有冲突吗?或者数组的两个成员var将取值81?

cas*_*sey 8

当您尝试var在所描述的情况下访问变量时,将出现编译时错误.具体错误如下:

Error: Name 'var' at (1) is an ambiguous reference to 'var' from module 'a'
Run Code Online (Sandbox Code Playgroud)

这些变量是否意味着全局范围?您可以声明它们中的一个(或两个),private以便它们作用于模块,并且不会污染全局范围.但在这种情况下,模块C将无法使用私有变量.另一种选择是限制use语句中导入的内容:

use A, only: some_variable1, some_other_variable
use B, only: var
Run Code Online (Sandbox Code Playgroud)

这会让varB从C进入C的范围,并且会var从A中隐藏起来.

如果必须在模块C中同时拥有这两个变量,则可以在使用模块时重命名一个变量.例如:

use A, varA => var
use B, varB => var
Run Code Online (Sandbox Code Playgroud)

它允许您通过名称varA和访问每个模块中的变量var varB.

看这个例子:

module A
  integer, parameter :: var = 81
 contains
end module

module B
  integer :: var(2)
 contains
end module

module C
  use A, varA => var
  use B, varB => var
 contains
end module

program test
  use C    
  print *, varA
end program
Run Code Online (Sandbox Code Playgroud)

这将打印81.