2010-09-17 105 views
1

我写了一个计算2 * 2矩阵的特征值的函数。它将一个2 * 2矩阵作为参数,并通过一个2元素数组返回2个特征值。我宣布这样的程序单元的功能:Fortran90错误:EXTERNAL属性与DIMENSION属性冲突

real, dimension(2), external :: eigenvalues 

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

Error: EXTERNAL attribute conflicts with DIMENSION attribute 

难道只是不可能有回报功能数组,或者我做错了什么?

任何帮助/建议表示赞赏,谢谢。如果有帮助,我正在使用fortran 90与gfortran编译器

+1

请勿使用外部程序。将所有程序放在模块中。 – Wildcat 2010-09-17 15:40:52

回答

1

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

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

1

英特尔Fortran编译器文档告诉我,EXTERNAL与DIMENSION不兼容,这与您的编译器告诉您的大致相同。我已经快速浏览了Fortran 2003的标准,但在这一点上没有明确地解释它 - 所以我会同意英特尔的看法,并断言你所做的是非标准的。

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

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

EIGENVALUES的来源与调用程序的来源有何关系?