global-variablesfortranprotected

Protected global variables in Fortran


I wonder if there is a way of having a global variable in Fortran, which can be stated as some kind of 'protected'. I am thinking of a module A that contains a list of variables. Every other module or subroutine that uses A can use it's variables. If you know what the value of the variable is, you could use parameter to achieve that it can't be overwritten. But what if you have to run code first to determine the variables value? You could not state it as parameter since you need to change it. Is there a way to do something similar but at a specific point at runtime?


Solution

  • You could use the PROTECTEDattribute in a module. It has been introduced with the Fortran 2003 standard. The procedures in the module can change PROTECTED objects, but not procedures in modules or programes that USE your module.

    Example:

    module m_test
        integer, protected :: a
        contains
            subroutine init(val)
                integer val            
                a = val
            end subroutine
    end module m_test
    
    program test
        use m_test
    
        call init(5)
        print *, a
        ! if you uncomment this line, the compiler will flag an error
        !a = 10
        print *, a
        call init(10)
        print *, a
    end program