【发布时间】:2016-04-18 02:15:37
【问题描述】:
在我的 Fortran 代码中,我在模块中定义变量,并在主程序中通过 USE 语句使用它们。
为了限制对模块内容的访问,默认情况下我将所有变量/函数/子例程声明为private,然后明确声明其中哪些是公共的。
当我想访问我在主程序中使用的模块的变量/函数/子例程时,这很有效,但是当模块 mod1 使用另一个模块 mod2 时,似乎所有变量/函数mod2 的 /subroutines 成为 mod1 私有的,不能从主程序访问。
保持mod2 public 中的公共声明的关键字是什么,以便我可以从主程序访问它们?
这是我的问题的最小工作示例
main.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