2014-12-04 63 views
1

在Nyhoff的Fortran書中, 51,聲明變量可以通過「常量表達式」來初始化。然而,Nyhoff似乎沒有說明一個常數表達式究竟是什麼。Fortran中的變量初始化

問題1:變量是否可以由用戶定義的函數初始化?例如:real :: myreal=myrealfunc(4.0)(這是可能的的變量由本徵函數被初始化。)

問題2:這是不直接相關的問題1考慮的情況下,當主節目不use的特定模塊,但其中一個子程序use這個模塊。如果一個變量是這個模塊的一部分,它是在主程序執行開始時初始化的,還是直到子程序(模塊use)被調用?

參考文獻(如果有的話)也有幫助。

回答

2

答案1:不,用戶定義的函數不能初始化變量。 R505(在我面前的Fortran 2008草案標準中)指出,變量只能由常數表達式初始化。同一文件的段落7.1.12.1定義了恆定表達式並且包括詞語它是其中每個操作是固有的表達式

答案2:use -d變量只能在use -d的範圍內訪問。實際初始化時,這是一個有爭議的問題。我懷疑它是依賴於處理器的(因爲該術語在標準的第1.3.114條中定義)。

我還懷疑編譯器會在程序啓動時初始化。儘管標準並不要求它,但幾乎沒有提示它,初始化表達式實際上可能是編譯器可以計算的。我想你可以通過檢查初始化一個大變量的程序的內存消耗來找出處​​理器的行爲。當變量不在範圍內時,您將無法簡單地打印或以其他方式檢查變量。

當然,初始化的變量會獲得save屬性,這意味着它們的值將在其封閉範圍的調用中保存。

標準中的引用來驗證此答案,現在就逃脫我。

+0

對於1:謝謝。我習慣於MATLAB類,它們允許您使用用戶定義的函數來初始化類變量。所以對於Fortran我想我會創建一個獨立的setter函數來調用來設置模塊變量的值。對於2:是的,考慮到Q1的答案,當這些變量初始化並且Q2現在沒有實際意義時,這並不重要。 – boxofchalk1 2014-12-05 17:25:09

+0

只是爲了記錄,因爲這個問題是用fortran90標記的,所以我應該提到引用的材料也出現在Fortran 90標準中,並且gfortran(我使用的編譯器)完全符合標準。 – boxofchalk1 2014-12-05 17:32:12

2

對於第一個問題,我將採用與High Performance Mark's answer第7.1.12.1段相同的起點,但對其略有不同解釋。我會得出同樣的結論。

是的,在常量表達式中的每個操作都必須是內在的,但是對用戶定義的函數的引用不是一個操作。相反,它是主要的,並且在該段落中包含允許的原色列表。

也就是說,從下面的子段落(4-8)中允許的主要事例中可以看出,每個函數的引用必須是一個內部函數。