我想在我的代码中添加一个函数来计算一些变量。我创建了一个虚拟函数
double precision FUNCTION rawSE(x)
double precision x
real ax
rawSE = 0.0d0
return
END
我用
来称呼它 selfE=rawSE(1.0d0)
当我尝试编译代码时,我在标题中收到错误。当我用值(1.0d0)替换rawSE时,我没有收到错误。当我用另一个函数替换它时,我没有收到错误。我复制了一个正常工作并重命名的函数。我收到了错误。
那么......这里发生了什么?这不是列位置问题(至少不是一个简单的问题),因为它们都是从同一行开始的。
如何解决这个问题?
答案 0 :(得分:0)
rawSE函数在模块中声明,并且期望值而不是函数。将声明移出模块部分解决了这个问题。
答案 1 :(得分: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
如果是这样,那就是问题所在。您应该声明该函数一次,因此应删除“This line”行。保留模块更好,因为这使得接口对编译器是显式的。它不仅“知道”函数返回是双精度,它还“知道”函数具有单个双精度参数。这使它能够检查调用的参数以确保与这些属性的一致性。
P.S。 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)