Fortran编译器错误

时间:2011-10-04 13:28:08

标签: compiler-errors fortran

我正在尝试使用适用于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专家能够澄清这个问题,我将非常感激。

提前多多感谢!

2 个答案:

答案 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”之间没有指令)。