0

我想在我的代码中添加一个函数来计算一些变量。我创建了一个虚拟函数

  double precision FUNCTION rawSE(x)
  double precision x
  real ax
  rawSE = 0.0d0
  return
  END

我称之为使用

  selfE=rawSE(1.0d0)

当我尝试编译代码时,标题中出现错误。当我用值 (1.0d0) 替换 rawSE 时,我没有收到错误消息。当我用另一个函数替换它时,我没有收到错误。我复制了一个正常工作的函数并将其重命名。我得到了错误。

那么......这里发生了什么?这不是列位置问题(至少不是一个简单的问题),因为它们都从同一行开始。

如何解决这个问题?

4

2 回答 2

0

The rawSE function was declared in a module and a value was expected instead of a function. Moving the declaration out of the module part solved this.

于 2013-03-02T10:46:54.067 回答
0

我问你是否rawSE在使用它的程序中声明,你回答说你声明为double precision. 你的意思是你在模块和使用模块的程序中都声明了函数?像这样?

module my_stuff

implicit none

contains

double precision FUNCTION rawSE(x)
  double precision x
  rawSE = 2.0d0 * x
  return
end FUNCTION rawSE

end module my_stuff


program test_rawSE

use my_stuff

implicit none

double precision rawSE   ! <-- This line

write (*, *) rawSE (2.0d0)

end program test_rawSE

如果是这样,那就是问题所在。您应该声明该函数一次,因此应删除“此行”行。最好保留模块,因为这会使接口对编译器显式。它不仅“知道”函数返回是双精度的,它还“知道”函数有一个双精度参数。这使它能够检查调用的参数是否与这些属性保持一致。

PS gfortran 4.1 真的很老而且过时了。更新的版本有了很大的改进。这可能是错误消息神秘的原因。gfortran 4.7 确定两个语句相互冲突:

double precision rawSE
                      1
rawSE.f90:18.4:

use my_stuff
    2
Error: Symbol 'rawse' at (1) conflicts with symbol from module 'my_stuff', use-associated at (2)
于 2013-03-03T17:11:15.893 回答