2013-04-04 91 views
1

我已經問過這個問題了,但是這次我試圖更清楚一點。 我真的是Fortran的新手,所以原諒任何sytax錯誤,這是更多僞代碼。fortran模塊的範圍

module variables 
    implicit none 
    SAVE 

    integer x 
    integer y 

end module 

subroutine init() 

    use variables 

    x = x + 2 
    y = y + 1 
endsubroutine 

那麼我的主要程序是

program main 
    use variables 
    implicit none 

    call init() 

    call some_other_function() 
    endprogram 

如果我包括我的模塊將它們保留其值some_other_function() 假設some_other_function()是一個巨大的仿真程序的一個抽象。 我可以依靠我的初始化變量保持它們的值。

這是模塊中的SAVE語句嗎?

背景信息:我有程序1正在被program2 調用很長時間。 Program1有一個巨大的利用階段,只需要發生一次。如果我在program2調用program1之前運行了初始階段,是否可以依賴所有保存的模塊聲明變量

+0

另外我還有做一個endubroutine保存, 或包括保存在模塊 – 2013-04-04 19:31:44

回答

3

在模塊中使用SAVE語句時,模塊變量的值在運行期間保留程序。如果您在一個程序中初始化它們,主程序和其他程序將會看到這些值。只要他們是在範圍模塊變量被保留下來,因爲你可以從主程序use你的榜樣模塊,它們的值將保留爲運行即使沒有SAVE發言時間。原則上,如果某個模塊僅用於某些過程,並且未使用語句,則編譯器可能在調用鏈中沒有任何過程時「忘記」這些值。可能很多或許所有的編譯器不實際重置價值......這將是額外的工作,找出一個模塊是否超出範圍。

P.S.你的例子有一個錯誤,因爲你永遠不會初始化x和y。你只能改變它們的值。

+2

+1有區別+1:作爲次要記錄,F2008指定模塊變量隱含SAVE'd。 – janneb 2013-04-04 18:27:51

+0

現在另一個問題是,即時通訊軟件處理。有一個仿真程序1調用另一個仿真程序2。 Program2有可能在多個線程上運行。 Im相當肯定目前這個問題,因爲程序2利用被寫入主要包括保存模塊,所以變量可以同時仍然需要它們被覆蓋。 有沒有一個簡單的解決方法。我可以創建一個派生類型,它只是包含所有這些模塊。 – 2013-04-04 19:23:46

+1

@RobertLemiesz:是的,這聽起來像是一個問題。不,沒有簡單的解決方法。改造線程安全到沒有考慮到這一點而設計的程序往往是大量的工作.. – janneb 2013-04-04 19:42:31