2012-03-26 34 views
1

我在看Fortran編寫的空氣質量模型的代碼,並且有一些關於fortran從do循環中傳遞變量的問題。爲什麼Fortran DO循環索引大於循環後的上限?

這個非常簡單的例子說明我的意思:

PROGRAM carla 
    IMPLICIT NONE 
    ! 
    INTEGER, PARAMETER :: LM = 24, DEZASSEIS = 16 
    INTEGER   :: L, VARIAVEL, SOMA 
    ! 
    DO L=1,LM 
    WRITE(*,*) 'L = ', L 
    END DO 
    ! 
    WRITE(*,*) 'I am now ouside of the DO loop.' 
    WRITE(*,*) 'I would expect L=LM=24... And SOMA=40' 
    WRITE(*,*) 'L = ', L 
    SOMA = DEZASSEIS + L 
    WRITE(*,*) 'SOMA = ', SOMA 
    END PROGRAM carla 

我希望L = LM = 24 ......而SOMA = 40 ... 而是我得到:

L =   25 
    SOMA =   41 

我不明白爲什麼一旦我們在DO循環之外,L就不會保留假定的最後一個值(SOMA將因此等於40),並且不斷增加...

有人可以給我一個hin T'

+0

那麼你在循環之後看到的L和SOMA的值是什麼? – 2012-03-26 22:49:52

+0

L = 25和SOMA = 41! – carla 2012-03-26 22:51:47

回答

1

循環從1到24, 所以當它到達25,循環完成。

Think of it as 
(pseudocode) 
LL = 1 
While LL < 25 
LL = LL + 1; 

正如GummiV所說,不要這樣做。循環是編譯器優化的主要目標,不能保證循環執行後的內容。可能同樣容易爲0,因爲在某些機器上檢測LL = 0比LL> 24快,所以一次優化可以反轉計數。速度並不快,但編譯器人員會遇到一個真正的問題。

+6

「可能很容易就是0」 - 不,Fortran的規則在循環之後指定循環變量的值。別的東西是一個編譯器錯誤。 – 2012-03-26 23:16:40

+0

這取決於編譯器,即使它們在Fortran中都適用。其他語言/編譯器肯定不是這樣。省去很多麻煩,不要在循環外使用循環變量。 – 2012-03-27 09:14:04

+0

我不想在循環之外使用循環變量! 這個問題源於代碼中的錯誤 - 一個變量在循環之外使用(但它已經被修正) - 我想了解模型在運行舊代碼時的行爲... – carla 2012-03-27 09:25:06

3

Fortran不能這樣工作。 (它不是MATLAB:P)

練習警告如果使用DO循環 外側的索引變量,因爲變量在循環結束時遞增,即它 將步長比最終值以下。

http://www.oc.nps.edu/~bird/oc3030_online/fortran/do/do.html

這爲什麼L=25循環後解釋說。

編輯:以下錯誤。見下面

M.S.B.的評論在Fortran中的DO變量...永遠不應該在循環外部引用而不明確的值分配給它。 - http://www.esm.psu.edu/~ajm138/fortranexamples.html

+3

海報問題顯示L的值是25,這正如您引用的Fortran規則所預期的那樣。我認爲應該永遠不要在循環之外引用DO變量的陳述是過分陳述的,不應該被視爲「法律」......這是避免混淆的典型做法,好。 – 2012-03-26 23:12:43

+0

感謝您的澄清。我已根據您的評論編輯了我的答案。 (原始海報必須在發佈之後立即編輯他的問題,但在發佈之前我沒有刷新,我可以發誓L = 25信息不在那裏,當我回復時) – GummiV 2012-03-27 01:18:31

+0

您在[psu](http://www.esm .psu.edu /〜ajm138/fortranexamples.html)不應該太過認真:第一個例子顯然必然會在使用「靜態」局部變量的編譯器上失敗,正如示例2中所解釋的。教好壞招數,甚至失敗你注意到DO循環。 – 2013-08-09 13:40:16