2015-08-22 33 views
1

這個問題已經存在了幾年,但我從來沒有聽說過一個很好的解決方案。Fortran接口本身產生惱人的錯誤

如果一個Fortran子程序包括與接口模塊本身 subroutine stuff(nz,z,dt) use allinterfaces ... 發生錯誤

Error: 'stuff' of module 'allinterfaces', imported at (1), is also the name of the current program unit

要解決它,我必須聲明 subroutine stuff(nz,z,dt) use allinterfaces, except_this_one => stuff ...

這是荒謬的行爲和惱人的,因爲我喜歡在模塊中包含所有接口。這不應該是一個編譯錯誤,或者至少應該有一個編譯器我使用的是Gfortran版本4.8.2(GCC),但我懷疑這是編譯器的錯誤。

有沒有人瞭解這種行爲背後的理由,因爲它可能是錯誤的,或更實際的解決方案?

甚至可能更荒謬的是,編譯器可以使用這些信息來檢查模塊中定義的接口是否與實際的子程序相匹配。所以這比它可能會更糟的兩個級別。忽視這些信息是一個錯失的機會;把它看作一個錯誤似乎是一個可怕的想法。

+1

我有同樣的問題...因此,接口塊不能檢查定義本身是否正確>< – roygvib

+0

如果您有一個使用包含接口塊的模塊的子例程那個子程序的接口,那肯定不是編譯器的錯。你在做什麼? – francescalus

+1

@francescalus雖然我不知道OP的情況,但我只是對「標準委員會」爲什麼禁止這個事情感興趣(因爲我似乎沒有什麼好的理由)。其中一個有用的方案是從一個巨大的舊Fortran樣式包(它不包含在模塊中)中調用一個例程,並且希望確保相關子例程調用(特別是新添加的)的一致性。根據我的經驗,一些仍在積極開發的電子結構代碼是以這種風格編寫的(它甚至依賴於大量的COMMON塊......嗯)。 – roygvib

回答

7

此行爲由Fortran標準指定。標準委員會討論了放寬限制,稱爲「與自我的接口」,但最終拒絕了它。我不記得具體情況。由於標準禁止它,所以編譯器需要能夠診斷它,並且大多數是默認的。

只有在嘗試逐步更新F77風格的程序以使用顯式接口時纔會遇到此問題。我會注意到,英特爾Fortran,也許gfortran,也有一個功能,會自動檢查你的接口(如果它是-warn接口)。

也許更好的方法是把你的程序放在模塊中。

+0

謝謝!看起來最近的Fortran標準已經模糊了模塊,這與傳統的Fortran程序員疏遠了。爲什麼我們現在必須將所有內容都包含在模塊中? 對於gfortran,我只能找到-Wimplicit-interface和-Wimplicit-作爲相關編譯器選項。 –

+1

將過程轉換爲模塊是一個相對簡單的過程,並且可以更容易地診斷因錯誤地調用子例程或函數而導致的問題。我會爭辯說,你在原始文章中試圖做的事情與對已過時的編碼風格的癡迷有關。 – bdforbes