2017-10-20 62 views
0

我現有的子程序A(a,b,c,d,e)工作正常,其中 a,b,c是實際參數,de是可選參數。如何在子例程參數列表中禁用可選參數的默認關聯?

許多其他的子程序調用子程序A

call A(a,b,c) 

call A(a,b,c,d=2.0D0) 

call A(a,b,c,e=1.0D0) 

現在。

我決定從子程序A中刪除c

,使其成爲

subroutine A(a,b,d,e) 

當我重新編譯代碼,行如

call A(a,b,c,e=1.0D0) 

不是由編譯器,這是不 我想要什麼抱怨。現在,它認爲c是新的子程序的 可選參數dA(a,b,d,e)

我可以搜索我的所有代碼子程序A的所有出現 避免這種錯誤的解釋,但我錯過了,甚至他們中的一個,我會 要付出巨大的代價(錯誤的結果,痛苦的時刻,...),但一個好的伎倆讓 編譯器抱怨,我必須解決它們。

這帶來了我的問題。如何讓編譯器不要假設 可選變量的默認關聯,除非我在=符號中輸入?即,如果我想要 使用一個可選變量,我會將其作爲c=2.0D0,e=3.0D0傳遞給它。 無=符號,有沒有辦法使它成爲默認的非選項 參數?

這樣,編譯器肯定會抱怨,因爲c不是 匹配修改的子例程中的任何現有變量。

+0

歡迎光臨。請閱讀[旅遊]和[問]。適當的格式將使你的文章更好。使用標籤[tag:fortran]。如果您想限制舊的和過時的Fortran 90的答案(通常不需要),可以添加[tag:fortran90]。 –

回答

3

您不能禁用此行爲。 Fortran標準規則要求這樣做。您將不得不使用不同的語言,但不能使用Fortran。

爲了防止出現這種情況,您可以在所有調用的參數列表中爲所有參數使用命名參數。

此外,還有一些工具可幫助您重構代碼(code refactoring)。您也可以使用簡單的grepsed或代碼編輯器的搜索和替換功能(它應該能夠搜索整個項目或目錄)。

2

也許作爲臨時措施,在刪除參數之前,將僞參數C的類型更改爲不同的東西 - 例如,使其成爲您爲該參數專門創建的派生類型的對象。如果在過程定義中使用該更改類型重新編譯,則編譯器將標記仍具有與C相對應的位置參數的過程。

(如果您用於C的派生類型無法在定義模塊之外訪問的程序,那麼這種做法是迫使你的代碼的客戶端始終使用命名實際參數在過程中參考的一種方式)

例如:

subroutine proc(a, b, c, d, e) 
    real :: a, b, c, d, e 
    optional :: d, e 
    ... 

type, private :: dummy 
end type dummy 

subroutine proc(a, b, c, d, e) 
    real :: a, b, d, e 
    type(dummy) :: c 
    optional :: c, d, e 
+0

這是一種*臨時措施*,它將成爲下一代程序員難以解決的維護問題。我想知道SO是否會在這個問題上存在很長的時間?我有一個Fortran 2008程序,它包含一個空的派生類型,它似乎被用作許多子例程的可選參數。任何人都可以告訴我什麼是Fortran?* :-) –