2016-12-02 5 views
1

という共通ブロックにあるvarという変数がある場合、同じ名前を使用して共通ブロックを使用しない2つの他のサブルーチン間で引数を渡すことができますか?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

あなたはあまりにも多くのレガシーコードベースを変更したくない場合は、私はあなたがmodulecommonブロックを入れて、アクセスが必要なときに変数をインポート勧め:

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 

またはより良いまだ、私は最後には

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ブロックを避ける(これは、レガシーコードベースの完全な書き直しが必要)と、すべてのサブルーチンを閉じ込める提案し、あなたの中の変数を行います commonブロックに初期化が必要ですか?そうであれば、 dataステートメント、さらには block data構造を含むさらに複雑な問題が発生します。

関連する問題