【问题标题】:How to call public variables of a used module through a module with private statement如何通过带有私有语句的模块调用已使用模块的公共变量
【发布时间】:2016-04-18 02:15:37
【问题描述】:

在我的 Fortran 代码中,我在模块中定义变量,并在主程序中通过 USE 语句使用它们。 为了限制对模块内容的访问,默认情况下我将所有变量/函数/子例程声明为private,然后明确声明其中哪些是公共的。

当我想访问我在主程序中使用的模块的变量/函数/子例程时,这很有效,但是当模块 mod1 使用另一个模块 mod2 时,似乎所有变量/函数mod2 的 /subroutines 成为 mod1 私有的,不能从主程序访问。

保持mod2 public 中的公共声明的关键字是什么,以便我可以从主程序访问它们?

这是我的问题的最小工作示例

ma​​in.f90

program main
use mod1
implicit none
print*,publicvar
end program main

mod1.f90

module mod1
use mod2
private
end module mod1

mod2.f90

module mod2
private
integer, parameter, public :: publicvar = 1
end module mod2

运行示例:

>ifort mod2.f90 mod1.f90 main.f90 -o main
main.f90(6): error #6404: This name does not have a type, and must have an explicit type.   [PUBLICVAR]
  print*,publicvar
---------^

如果我删除 mod1 中的 private 语句,它会起作用,但这对我来说是不可接受的,因为我希望默认情况下将我的所有变量/函数/子例程保留在模块中。

【问题讨论】:

  • 我可以理解为什么有些人使用不幸的标签fortran90,但是在一个关于子模块的问题中?认真的吗?
  • @VladimirF 虽然标题说“子模块”,但在我看来,问题与它们无关。我已经编辑(希望 Mazmike 会确认我是正确的)标题。
  • 除了 IanH 的回答之外,您还可以考虑:将mod1 中的默认可访问性设为公开,并明确将其实体设为私有;在主程序中使用mod2

标签: fortran


【解决方案1】:

mod1 中使用PUBLIC 语句将与mod2 关联的事物标记为mod1 的公共实体。

module mod1
  use mod2
  private
  public :: publicvar   ! from mod2
end module mod1

【讨论】:

  • 感谢 IanH。您的解决方案有效,但在mod2 中添加任何公共变量都必须伴随着对 mod1 的修改。用于大代码可能会变得很挑剔(考虑在mod10 中添加多个变量,mod9 使用,直到mod1 使用。我想知道您是否有其他解决方案不需要将您感兴趣的所有变量显式声明为公共。
  • 不在当前的 Fortran 中,除非您删除 mod 中的私有语句。该标准的下一个修订版可能包含这样的设施。
  • 感谢您的精确。我终于用了你的方法,也是francescalus推荐的。我一直在等待这个新工具可能包含在标准的修订版中,因为默认情况下将变量一般定义为私有并且明确声明公共变量对我来说似乎是一个更好的编程规则。
猜你喜欢
  • 2015-12-27
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2019-09-13
  • 1970-01-01
相关资源
最近更新 更多