2016-12-02 6 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 

У меня есть проблема с Var проходящего между SR1 и SR2, может проблема исходить от другого имени 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.