2016-12-02 75 views
1

如果我有一個名爲var的變量位於一個名爲myCB的公共塊中,我可以使用相同的名稱在兩個不使用公共塊myCB的子程序之間傳遞參數嗎?公用塊和子程序自變量

代碼如下所示。

Subroutine SR1(Var) 
     !something here using Var 
end Subroutine SR1 

Subroutine SR2() 
.... 
     Call SR1(B) 
.... 
end Subroutine SR2 

Subroutine SR3() 
common \myCB\ Var 
... 
    ! something using the other Var shared with SR4 
...... 
end Subroutine SR3 

Subroutine SR4() 
common \myCB\ Var 
.... 
... ! something using the other Var shared with SR3 
.... 
end Subroutine SR4 

我也有VarSR1SR2之間傳遞的問題,可以從其他命名的公共塊Var來的問題?

+1

我想你需要提供一個更完整的例子(見[mcve]),並說明你爲什麼認爲存在問題。現在的問題,我們將主要猜測。圍繞範圍有一些重要的事情,但是從當前代碼片段中遺漏了很多,所以無法分辨。 – francescalus

+0

整個代碼是2600行,但我會考慮如何編輯我的文章,以更具體的代碼更多細節,謝謝 – Dadep

回答

1

如果你不想修改遺留代碼庫太多了,我建議你把common塊在module並導入變量時需要訪問:

module myCB_mod 
    common /myCB/ var, var2, var3 
    save ! This is not necessary in Fortran 2008+ 
end module myCB_mod 

subroutine SR2() 
    use myCB_mod 
    !....... 
    call SR1(B) 
    !..... 
end subroutine SR2 

subroutine SR3() 
    use myCB_mod 
    !....... 
end subroutine SR3 

subroutine SR4() 
    use myCB_mod 
    !..... 
end subroutine SR4 

或更好,但我建議你避免common塊共(這需要遺留代碼庫的全部重寫)和限制一module

module myCB 
    implicit none 
    real var, var2, var3 
    save ! This is not necessary in Fortran 2008+ 
end module myCB 

module mySubs 
    use myCB 
    implicit none 
contains 
    subroutine SR2() 
      !....... 
      call SR1(B) 
      !..... 
    end subroutine SR2 

    subroutine SR3() 
      !....... 
    end subroutine SR3 

    subroutine SR4() 
      !..... 
    end subroutine SR4 
end module 

最後裏面所有的子程序,在做你的變量common塊需要初始化嗎?如果是這樣,這會引入甚至更多的併發症,涉及data陳述或甚至block data構造。