Compilation 调用特定函数时的不可分类语句

Compilation 调用特定函数时的不可分类语句,compilation,fortran,Compilation,Fortran,我想在代码中添加一个函数来计算一些变量。我创建了一个伪函数 double precision FUNCTION rawSE(x) double precision x real ax rawSE = 0.0d0 return END 我称之为使用 selfE=rawSE(1.0d0) 当我试图编译代码时,标题中出现了错误。当我用一个值(1.0d0)替换rawSE时,我没有得到一个错误。当我用另一个函数替换它时,不会出现错误。我复制了一个正常工作的函数,并将其重命名

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

  double precision FUNCTION rawSE(x)
  double precision x
  real ax
  rawSE = 0.0d0
  return
  END
我称之为使用

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

所以。。。这是怎么回事?这不是一个列位置问题(至少不是一个简单的问题),因为它们都从同一行开始


如何解决此问题?

在模块中声明了rawSE函数,需要的是值而不是函数。将声明移出模块部分解决了这个问题。

我问您是否在使用它的程序中声明了
rawSE
,您回答说您声明为
双精度
。您的意思是在模块和使用模块的程序中声明函数吗?像这样

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

但是,如果导入模块,则应该能够访问rawSE函数。如果可能的话,我们应该尝试将内容移动到模块中,而不是将它们移出模块,例如编译器可以只检查模块过程的正确调用…@BálintAradi这是我的逻辑,但我认为它不起作用。在这种情况下还有什么其他意义呢?很难说没有看到更多的代码。你有没有一些简单的自我包含的例子来演示这个问题?我会尝试生成一个。不过,这需要一些时间。我建议您向我们展示更多的代码,例如调用此函数的代码和相关声明。如下面的评论所述,将过程包含在模块中并使用它们以便检查接口是一种良好的做法。从模块中删除此函数可能会隐藏问题,而不是修复问题。@M.S.B.这是一行。我调用这个函数一次,我只使用它来保持代码流的逻辑性。我把这条线称为任何环路之外的线路。正如我在下面的回答中提到的,解决方案是将rawSE声明移到模块之外。您是否有冲突的rawSE声明?例如在使用它的程序中声明它
external
或它的类型
double precision
?只是想猜点什么。。。你在使用什么编译器?我在代码中声明它为双精度。这也是我声明其他函数的方式。我使用的f95编译器gcc版本是4.1.2,与我的代码中的版本更相似。至少可以说,我认为我的记谱法是不可取的。我无法在我的服务器上更新编译器,因为旧的程序员方法“如果它不是borken就不要修复”。谢谢您的时间。@Yotam:如果您将
外部rawSE
添加到模块中,或者如果您将
双精度rawSE
声明放在
程序中,则该代码应该可以工作。不管怎样,外部程序都是F77风格的,并没有真正利用模块的功能。关于编译器的策略是值得注意的,因为只要gfortran 4.1没有“中断”,即使最新的编译器仍然可以使用F77代码,它就禁止您使用支持的任何较新功能。
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)