Externally declared (global) variable in Fortran

2019-01-20 20:41发布

问题:

I want to know if it's possible to declare a variable and have declaration carry over to another subroutine or program (hence become global)

For example

program main
    implicit none
    call mysub
    print *, x
end program main

subroutine mysub
    implicit none
    integer, parameter :: x = 1
end subroutine mysub

Would print "1"

Is this possible? I want to do this because a program I'm working on has large sets of variables that I would rather avoid copying unless necessary.

回答1:

The most straightforward way to do this in modern Fortran is with modules.

Consider

module globals
  implicit none
  integer :: x
end module globals

program main
  use globals
  implicit none
  call mysub
  print *,x
end program main

subroutine mysub
  use globals
  implicit none
  x = 1
end subroutine mysub

In this paradigm you specify your "global" variables within the module and use that module everywhere you want access to them.

If you are just using this to declare contants (parameters) you can simplify this to:

module globals
  implicit none
  integer, parameter :: x=1
end module globals

program main
  use globals
  implicit none
  print *,x
end program main

The older method to accomplish this involved common blocks and includeing files that declared them every procedure that accessed them. If you find a tutorial dealing with the common block method I advise you to ignore them and avoid their use in new code.