我正在尝试使用适用于Linux的英特尔Fortran编译器(版本12.0.3)编译我的程序,我收到此错误:
buggy.f90(206): error #6219: A specification expression object must be a dummy
argument, a COMMON block object, or an object accessible through host or use
association [SPECTRUM]
type(spect) :: spectrum
----------------------------------------^
这是在一个模块内。 type(spect)
来自另一个模块,我在问题模块的开头我use
。这是一些代码;更多细节可以在下面找到。
module non_buggy
implicit none
type axis
character(len=6) :: nucleus
integer :: num_data_points
real :: spectral_width
end type axis
type spect
integer :: num_dim
type(axis), allocatable :: axes(:)
real, allocatable :: intensity(:)
character(len=10) :: type = ''
end type spect
type(spect), target :: spectrum ! might this be a cause of error?
contains
! ...
end module non_buggy
module buggy
use non_buggy
implicit none
contains
subroutine no_problem_here()
type(spect) :: spectrum ! compiles beautifully
! ...
end subroutine no_problem_here
subroutine problem()
type(spect) :: spectrum ! does not compile, but no error if I change the variable name
! ...
end subroutine problem
end module buggy
我已经阅读了错误的含义,但我的印象并不适用于我在代码中所做的事情 - 在这些行上没有指定数组边界。如果我将第二次出现的spectrum
重命名为其他内容,则错误消失了,我想知道问题是否与模块spectrum
中的模块变量non_buggy
有关(但是然后错误仍然存在,即使我注释掉声明模块变量的行)。如果Fortran专家能够澄清这个问题,我将非常感激。
提前多多感谢!
答案 0 :(得分:4)
无法在linux和osx上使用ifort 11重现。我没有ifort 12所以我无法验证,但这里的重点是你从模块中导出spectrum
,这很可能是一个坏主意。始终在模块中使用关键字private
,并明确公开您想要发布的内容。
如果你想让光谱成为一个模块变量(我不明白的东西,为什么你呢?你期望只有一个光谱吗?你确定吗?)你也可以考虑是否需要{{ 1}}关键字来保存值。
最后,你掩盖了一个模块变量。 Idiotic fortran没有命名空间的概念。如果您从另一个模块中的模块中抨击所有内容,则会污染您的命名空间,并且您很可能最终会遇到这些情况。在某些情况下,支持子程序导入,以限制损害(尽管它变得不那么交流)。保持模块变量最小化,当你这样做时,要么为它们添加唯一的前缀,或者根本不使用它们,并在代码的OOP布局中自律。
模块应该是无状态的。您可以获得灵活性和减少多线程头痛。
答案 1 :(得分:2)
我没有在代码示例中看到任何错误,即使它容易声明局部变量(在例程no_problem_here和问题中)具有与全局变量相同的名称(频谱)(模块上的那个) non_buggy)。
您使用的是什么编译器?我用ifort 11.1和gfortran 4.7.0编译你的样本没有问题(只是在注释模块non_buggy的关键字CONTAINS,因为ifort抱怨“contains”和“end module”之间没有指令)。