Когда модуль выходит за рамки в Fortran 90/95?

Мое предполагаемое использование

program main
  use mod

  external sub

  call sub
end program main

subroutine sub
  ! code here calls subroutines in mod
end subroutine sub

В частности, будет ли module mod подпадать под действие subroutine sub? Кроме того, мне было бы интересно узнать в более общем плане, когда модуль находится в/вне области действия. Я использую gfortran 4.6.1, если это имеет значение.


person astay13    schedule 12.12.2012    source источник


Ответы (1)


Это не относится к подпрограмме sub, так как sub не может вызывать подпрограммы или использовать переменные из мода, потому что sub не является частью программы main. Они не имеют ничего общего, являются отдельными единицами компиляции и могут вызывать друг друга только (если они вызываются).

Учти это:

program main

  external sub

  call sub
end program main

subroutine sub
  use mod
  ! code here calls subroutines in mod
end subroutine sub

Здесь вы можете использовать переменные и подпрограммы из mod в sub, потому что sub явно использует mod.

Другой пример, где sub является внутренней процедурой main:

program main
  use mod

  call sub

  contains

    subroutine sub
      ! code here calls subroutines in mod
    end subroutine sub

end program main

Также в этом случае вы можете использовать вещи из mod в sub, потому что все из main входит в область действия sub.

Наконец, в этом случае mod не входит в область действия, это похоже на исходный случай.

program main
  use mod
  use mod2

  call sub
end program main

module mod2

  contains

    subroutine sub

      ! code here calls subroutines in mod
    end subroutine sub

end module mod2

Другой проблемой является отмена определения переменных модуля, когда они выходят за рамки. Fortran 2008 решил эту проблему, сделав все переменные модуля неявно save.

person Vladimir F    schedule 12.12.2012
comment
Это полезно, спасибо. То есть в общем случае модуль находится в области видимости внутри программной единицы, которая его использует, но не во внешних единицах, вызываемых основной единицей? - person astay13; 12.12.2012
comment
Как насчет случая, когда у вас есть sub1, определенный в mod1, и у вас есть подпрограмма sub2, которая принимает внешнюю подпрограмму в качестве аргумента. Не могли бы вы передать sub1 sub2? call sub1(sub2) ? *работает с gfortran ... - person mgilson; 12.12.2012
comment
Ваш второй пример (с внутренней процедурой) не скомпилируется с помощью gfortran (и, я думаю, он также должен потерпеть неудачу с другими компиляторами). Вы не можете объявить процедуру внешней, а затем предоставить внутреннюю процедуру с тем же именем. - person mgilson; 12.12.2012
comment
Конечно, дополнительное внешнее определение — это просто ошибка копирования и вставки, спасибо за уведомление. Кстати, ее можно удалить везде, подпрограмму не нужно явно объявлять внешней. - person Vladimir F; 13.12.2012
comment
Fr первый комментарий: я думаю, что это должно работать. Я не вижу причин, почему бы и нет, но я не изучал стандарт для этого. - person Vladimir F; 13.12.2012