2016-12-02 1 views
1

이라는 공통 블록에있는 var이라는 변수를 가지고 있는데 공용 블록을 사용하지 않는 다른 두 서브 루틴간에 동일한 이름을 사용할 수 있습니까? 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 

내가 SR1SR2 사이를 통과하는 Var에 문제가 있습니까이 문제는 일반적인 블록 Var라는 이름의 다른에서 올 수 있을까? 당신이 너무 많이 레거시 코드베이스를 수정하지 않으려면

+1

더 완벽한 예제 ([mcve] 참조)를 제공해야하며 문제가 있다고 생각하는 이유를 제시해야합니다. 질문이 지금 서서, 우리는 크게 추측해야합니다. 범위 주변에는 중요한 것들이 있지만, 현재 코드 조각에서 너무 많이 빠져서 말할 수 없습니다. – francescalus

+0

전체 코드는 2,600 줄이지만, 코드에서 더 자세한 내용을 보려면 내 게시물을 편집하는 방법을 생각합니다. 감사합니다. – 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 

또는, I 당신이 모두 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 구문과 관련된 더 복잡한 문제가 발생합니다.