【问题标题】:Scope of variable inside a module in FortranFortran模块内变量的范围
【发布时间】:2019-09-16 14:40:50
【问题描述】:

我有一个模块:

module A
! derived data type definition
...
contains
  subroutine initialize()
  type(dtype), allocatable, dimension(:) :: var
  ! initialize the derived datatype variable "var"
  end initialize

  subroutine access()
  ! access derived datatype variable "var"
  end access

end module A

在main 程序中,initialize 和access 函数在不同的位置被调用。考虑到这两个函数都是在同一个模块中定义的,我可以在不将变量 var 传递给 access() 函数的情况下访问 access 函数中的初始化变量吗?

【问题讨论】:

  • 非常简单的答案是“是”,通过主机关联。我提出了一个重复的问题,该问题涉及各种细节,尽管它没有直接回答“是”方面。如果您需要有关“是”的原因的更多详细信息,请告诉我(并在示例代码中编辑更多详细信息)。
  • 谢谢!从我从重复的问题中看到的,它并没有直接回答你提到的问题。所以我想知道我的问题是否真的是重复的。
  • 即使派生类型变量在initialize()函数内部动态分配,它仍然成立吗?
  • 如果您需要详细信息,请将它们添加到问题中。实际上,代码根本没有 no 模块或局部变量!
  • 任何模块变量都可以在模块的过程中访问(除非 Fortran 2018 import 语句阻止)。不管是派生类型,还是可分配类型(等等)。

标签: scope fortran subroutine


【解决方案1】:

问题的代码中有三个作用域单位:

  • 模块A
  • 模块程序initialize
  • 模块程序access

Host 关联意味着在模块作用域单元中声明的变量(实体)可以在两个模块过程中访问。但是,在一个模块过程中声明的变量在另一个模块过程中是不可访问的。

也就是说,即使 type dtype 在模块中声明(并且在 initialize 中可用),variable var 对于该过程是本地的。同样,dtype 可在 access 中访问,但变量 var 不可访问。

要在两个过程中都可以访问var,应该在模块范围内声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多