2013-02-12 43 views
2

首先,我知道在Fortran中使用通用塊是一個壞主意(通常編程)。但是,我正在更新別人的代碼,我不想搞亂那些已知工作的東西。
其次,我知道我應該發佈更具體的東西,然後這個。如果我知道如何將它縮小到某種程度,我會這樣做。然而,因爲我知道,我不認爲你會欣賞2500行代碼,我不能發表一個具體的例子。
考慮到這一點,我無法描述我的問題。爲什麼公用塊變量不保存它們的值?

我更新別人的Fortran代碼。這個人使用了幾個(4)通用塊來設置全局變量。由於某種原因,當我調用使用這種塊的函數時,它的所有值都是0.有沒有人遇到過這種情況?有誰知道爲什麼會發生這種情況?如何重現這一點?任何檢查此的起點都會有所幫助。

對於什麼是價值,上述公共塊聲明爲

common /set/ block,x,y,z,llx,lly,llz,ilx,ily,ilz,third,third2 

block是一個四維陣列。 x,yz是1D陣列。 llxlly,和llz,是double precision類型。其餘的是integer類型。

在調用任何函數之前,在主程序中聲明並初始化公共塊。

+2

即使您先前設置了它們,它們也爲零?所有公共區塊的聲明尺寸是否相同? – 2013-02-12 12:44:16

+0

你不能將公共塊升級到模塊嗎?唯一的區別是在當前使用通用塊的地方「使用」模塊。主要優點是你只需要在一個地方聲明變量,順序無關緊要。 – sigma 2013-02-12 14:43:44

+0

@sigma我可以,但這需要謹慎。如果可以,我寧願避免這種情況。 – Yotam 2013-02-12 15:33:58

回答

1

一些編譯器做初始化公共變量爲零,因此,如果您第一次調用函數與公共塊,你會發現到處都是零(雖然你應該依靠這一點)。但是,一旦在程序中爲公共塊變量設置了一些值,那麼無論何時使用公共塊,都應該顯示這些值。

作爲公共塊中的變量:它們可以是任意類型,只要它們在所有使用公用塊的地方一致定義。

+0

OP聲稱問題是保留值,而不是初始化。否則,無論編譯器如何,BSS段都會在ELF可執行文件中自動歸零。 – 2013-02-12 15:47:13

0

你能和這個小例子比較你的代碼?我想你可能會錯過一些東西,比如子例程中的「common」聲明。

注意,你並不需要使用相同的名稱爲變量的子程序(AA)如您有主(GB)內。只是常見的塊名稱(myarray)必須相同。但是,如果您用GB替換AA並且最終結果會稍微清晰一些,則沒有任何不好的情況發生。

program main 
    real    GB(4) 
    common /myarray/ GB 

    integer i 
    real  B(4) 

    GB=0 
    write(*,*) 'GB',GB 

    do i=1,4 
     call AddSubR() 
     write(*,*) 'GB',GB 
    enddo 

end program main 

subroutine AddSubR() 
    real    AA(4) 
    common /myarray/ AA 

    integer i 

    do i=1,4 
     AA(i) = AA(i)+1 
    enddo 

end subroutine AddSubR 
相關問題