为什么在模块中声明常量时omp函数不起作用?

时间:2012-02-18 21:41:33

标签: module compiler-errors openmp fortran90 gfortran

我为我的全局变量声明定义了一个模块'gvars'。当我定义 在我的gvars模块中integer :: nthreads, max_threads, tid, omp_get_max_threads, omp_get_num_threads, omp_get_thread_num,我的主例程中的调用maxthreads = omp_get_max_threads()在编译时给出了以下错误:

maxthreads = omp_get_max_threads()
1
Error: Unclassifiable statement at (1)

但是当我在我的主程序中包含上面的integer ::定义时,它编译得很好并且给了我想要的结果。如果我甚至在我的gvars模块中定义nthreads = -1,我能够在我的主程序中打印出正确的值,所以我知道它被正确包含和定义,这只是因为某种原因我不能将它作为openmp函数的返回值。

为什么会这样?

有没有其他方法可以将这些值保存为全局变量,并且仍然在我的主例程中而不是模块中定义它们?

如果重要,我正在使用gfortran编译

2 个答案:

答案 0 :(得分:1)

问题不在于maxthreads的声明,而是在omp_get_max_threads的同一行上的声明。正如haraldkl所示,您需要use omp_lib来自动访问这些函数的声明。

(如果由于某种原因你真的不想这样做,你也可以将语句external :: omp_get_max_threads, ...添加到模块中。)

答案 1 :(得分:0)

不是真正的答案,但我不知道如何将代码放在这里。遗憾...

 module gvars
   integer :: maxthreads
 end module gvars

 program test
  use gvars
  use omp_lib

  implicit none

  maxthreads = omp_get_max_threads()
 end program test

编译:    gfortran -fopenmp test.f90

gfotran -v给出的地方: gcc版本4.4.5(GCC)