我写了一个函数来计算2 * 2矩阵的特征值。它需要一个2 * 2矩阵作为参数,并通过一个2元素数组返回2个特征值。我在程序单元中声明了这个函数:
real, dimension(2), external :: eigenvalues
但它不会编译,它会出现这个错误:
Error: EXTERNAL attribute conflicts with DIMENSION attribute
是不是可能有返回数组的函数,或者我做错了什么?
感谢任何帮助/建议。如果它有帮助,我正在使用fortran 90和gfortran编译器
答案 0 :(得分:1)
英特尔Fortran编译器文档告诉我,EXTERNAL与DIMENSION不兼容,这大概就是编译器告诉你的内容。我已经快速浏览了Fortran 2003的标准,但是在这一点上未能明确地解释它 - 所以我同意英特尔的观点,并断言你要做的事情是非标准的。
你当然可以编写返回数组的函数。
对我来说,你编写了函数EIGENVALUES然后尝试将它声明为EXTERNAL,这看起来有点奇怪。我通常会将我的函数定义放在较大程序单元内的CONTAINS部分或调用单元USE的MODULE中。在这两种情况下,我都不需要声明任何外部的东西。
EIGENVALUES的来源在哪里作为调用程序的来源?
答案 1 :(得分:1)
适度扩展其他两个答案,我认为其他方法通常比旧的“外部”更好。 (“Fortran 2003手册”列出了至少一个必须使用“外部”的情况。)如前所述,对于您自己的源代码,将过程(函数和子程序)放入模块的包含部分,然后用它。这将自动使程序的接口显式化,以便编译器可以检查调用中的参数与过程的伪参数之间的兼容性 - 这可以捕获许多程序员错误。如果由于某种原因您无权访问Fortran源代码,例如,您正在链接到库或调用C,那么我将编写一个描述该过程的接口语句。这将通知编译器声明的名称是函数或程序,并指定允许参数检查的接口。我只会在模块方法不可行的情况下执行此操作,因为由于需要更改两个项目而进行更改时更多工作且容易出错。
根据“Fortran 2003手册”,这可能不起作用的原因是,使用external属性不提供显式接口,并且返回数组参数的函数需要显式接口。我不知道为什么在这种情况下接口被认为是非显式的。