首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran编译器错误

Fortran编译器错误
EN

Stack Overflow用户
提问于 2011-10-04 21:28:08
回答 2查看 4.2K关注 0票数 1

我正在尝试使用英特尔Fortran编译器Linux版(12.0.3版)编译我的程序,但遇到以下错误:

代码语言:javascript
复制
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。这里有一些代码;更多细节可以在下面找到。

代码语言:javascript
复制
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专家能澄清这个问题,我将不胜感激。

提前谢谢你!

EN

回答 2

Stack Overflow用户

发布于 2011-10-05 03:16:23

无法在linux和osx上使用ifort 11进行复制。我没有ifort 12,所以我不能验证,但这里的重点是您正在从模块导出spectrum,这很可能是一个坏主意。始终在模块中使用关键字private,并且只公开您想要发布的内容。

如果你想让spectrum成为一个模块变量(这是我不明白的,你为什么要这样做呢?您是否期望有且仅有一种频谱?你确定吗?)您还可以考虑是否需要save关键字来保留这些值。

最后,你遮蔽了一个模块变量。愚蠢的fortran没有名称空间的概念。如果您将来自另一个模块中的所有内容都放在另一个模块中,则会污染您的命名空间,并且很可能会出现这种情况。在某些情况下,支持子例程导入,以限制损害(尽管它变得不那么具有交互性)。将你的模块变量保持在最小,当你这样做的时候,要么用一个唯一的前缀作为它们的前缀,要么干脆不使用它们,并在类似OOP的代码布局中约束自己。

模块应该是无状态的。您既可以获得灵活性,又可以减少多线程的麻烦。

票数 4
EN

Stack Overflow用户

发布于 2011-10-05 02:31:10

我在您的代码示例中看不到任何错误,即使声明局部变量(在例程no_problem_here和problem中)与全局变量(模块non_buggy上的变量)具有相同的名称(spectrum)很容易出错。

你用的是什么编译器?我毫不费力地用ifort11.1和gfortran4.7.0编译了你的样例(只是在注释模块non_buggy的关键字时,因为ifort抱怨“包含”和“结束模块”之间没有指令)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7648641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档