2010-09-17 44 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的來源與調用程序的來源有何關係?