我正在尝试使用英特尔Fortran编译器Linux版(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重命名为其他名称,错误就会消失,我想知道问题是否与模块non_buggy中的模块变量spectrum有关(但随后错误仍然存在,即使我注释掉声明模块变量的行)。如果Fortran专家能澄清这个问题,我将不胜感激。
提前谢谢你!
发布于 2011-10-05 03:16:23
无法在linux和osx上使用ifort 11进行复制。我没有ifort 12,所以我不能验证,但这里的重点是您正在从模块导出spectrum,这很可能是一个坏主意。始终在模块中使用关键字private,并且只公开您想要发布的内容。
如果你想让spectrum成为一个模块变量(这是我不明白的,你为什么要这样做呢?您是否期望有且仅有一种频谱?你确定吗?)您还可以考虑是否需要save关键字来保留这些值。
最后,你遮蔽了一个模块变量。愚蠢的fortran没有名称空间的概念。如果您将来自另一个模块中的所有内容都放在另一个模块中,则会污染您的命名空间,并且很可能会出现这种情况。在某些情况下,支持子例程导入,以限制损害(尽管它变得不那么具有交互性)。将你的模块变量保持在最小,当你这样做的时候,要么用一个唯一的前缀作为它们的前缀,要么干脆不使用它们,并在类似OOP的代码布局中约束自己。
模块应该是无状态的。您既可以获得灵活性,又可以减少多线程的麻烦。
发布于 2011-10-05 02:31:10
我在您的代码示例中看不到任何错误,即使声明局部变量(在例程no_problem_here和problem中)与全局变量(模块non_buggy上的变量)具有相同的名称(spectrum)很容易出错。
你用的是什么编译器?我毫不费力地用ifort11.1和gfortran4.7.0编译了你的样例(只是在注释模块non_buggy的关键字时,因为ifort抱怨“包含”和“结束模块”之间没有指令)。
https://stackoverflow.com/questions/7648641
复制相似问题