2

我写了一个函数来计算 2*2 矩阵的特征值。它以 2*2 矩阵作为参数,并通过 2 元素数组返回 2 个特征值。我已经在程序单元中声明了这样的函数:

real, dimension(2), external :: eigenvalues

但它不会编译,它会出现这个错误:

Error: EXTERNAL attribute conflicts with DIMENSION attribute

是不可能有返回数组的函数,还是我做错了什么?

感谢任何帮助/建议,谢谢。如果有帮助,我正在使用带有 gfortran 编译器的 fortran 90

4

2 回答 2

1

英特尔 Fortran 编译器文档告诉我,EXTERNAL 与 DIMENSION 不兼容,这大致就是您的编译器告诉您的内容。我已经快速浏览了 Fortran 2003 的标准,但在这一点上未能明确地解释它——所以我同意英特尔的观点,并断言你正在尝试做的事情是非标准的。

您当然可以编写返回数组的函数。

你写了函数 EIGENVALUES 然后试图将它声明为 EXTERNAL,这对我来说有点奇怪。我通常会将我的函数定义放在更大的程序单元内的 CONTAINS 部分或调用单元使用的 MODULE 中。在这两种情况下,我都不需要声明任何 EXTERNAL。

EIGENVALUES 的来源和调用程序的来源在哪里?

于 2010-09-17T16:17:42.733 回答
1

适度扩展其他两个答案,我认为其他方法通常比旧的“外部”更可取。(“Fortran 2003 手册”列出了至少一种必须使用“外部”的情况。)如前所述,对于您自己的源代码,将过程(函数和子例程)放入模块的包含部分,然后使用它。这将自动使您的过程的接口显式,以便编译器可以检查调用中的参数和过程的虚拟参数之间的兼容性——这可以捕捉到很多程序员的错误。如果由于某种原因您无法访问 Fortran 源代码,例如,您正在链接到库或调用 C,那么我将编写一个接口语句来描述该过程。这将通知编译器声明的名称是函数或程序,并指定接口以允许参数检查。我只会在模块方法不可行的情况下这样做,因为它的工作量更大,并且在进行更改时容易出错,因为必须更改两个项目。

可能这不起作用的原因是,根据“Fortran 2003 Handbook”,使用外部属性不提供显式接口,并且返回数组参数的函数需要显式接口。我不知道为什么在这种情况下接口被认为是非显式的。

于 2010-09-17T17:03:42.083 回答