2017-07-18 59 views
1

很久以前我就被告知,在FORTRAN中,所有東西都是有價值的。因此,我需要做到這一點(提供mySubroutine適當別處定義):Fortran中如何引用數量?

double precision :: myArray(2) 
myArray(1:2) = (/ 2.3d0, 1.5d0 /) 
CALL mySubroutine(myArray) 

不過,我也發現,在程序編譯和運行正常,如果我這樣做

CALL mySubroutine((/ 2.3d0, 1.5d0 /)) 

無需定義一箇中介數組myArray。我以爲我通過引用將myArray轉換成mySubroutine。在第二版中引發了什麼?編譯器是否解開子程序調用的包裝,僅聲明臨時變量以通過引用傳遞它?

+1

在默認情況下,fortran中的所有內容(或行爲如同)通過引用傳遞。在第二種情況下,你是正確的編譯器有效地創建一個臨時數組並傳遞參考。請注意,如果'mysubroutine'修改了它的參數,它將在第一種情況下修改'myarray',並在第二種情況下做不可預測的事情。 – agentp

回答

3

很大程度上,嘗試通過傳遞引用和傳遞值對Fortran過程調用進行分類並不是很有用。您可以通過回答如this onethis one的問題找到更多詳細信息。

簡而言之,通常程序引用是這樣的,即程序中變量的變化反映在程序被引用的變量中。在某些情況下,編譯器可能會選擇進行拷入/拷出,而在其他情況下,它必須有效。同樣,僞參數的value屬性指定進行匿名複製。

在哪裏這個問題增加了一些稍微不同的是,在使用表達式,如

call mySubroutine([2.3d0, 1.5d0]) ! Using F2003 array constructor syntax 

是編譯器創建一個臨時變量?

不可否認,這可能只是一個術語上的鬆動,但值得一提的是,當然沒有涉及變量變量[2.3d0, 1.5d0]是一個表達式,而不是一個變量。關鍵是這意味着它不能在過程中被修改(出現在變量定義上下文中)。即使用表達式而不是一(暫時的)可變的情況下應用限制包括:

  • 與表達相關的僞參數可以不具有intent(inout)intent(out)屬性;
  • 如果虛擬參數沒有意圖屬性,那麼如果關聯的實際參數是表達式,那麼該參數可能不會被修改。

現在,如果僞參數具有value屬性,則過程的效果與引用的方式相同。

總而言之,程序可以用表達式而不是中間變量來工作。如果這不是因爲違反了Fortran的某些方面。它如何工作對於編譯器而不是程序員來說是一個問題。

+0

謝謝你的幫助!我問這個問題的一個動機是,這段代碼是一個函數的一部分,這個函數將循環多次,而且我想知道如果我通過直接將表達式插入到'mySubroutine'(它具有'intent (在)')。這樣,'myArray'不會一遍又一遍地重新初始化。 – QuantumDot