使用fortran子例程参数列表中的变量来设置同名的模块变量

时间:2015-06-25 02:12:44

标签: module fortran

我在Fortran模块中定义了一大堆变量。我希望有一个子程序,最简单的是,将模块级变量初始化为用户提供的变量。下面的简化代码可行,但是,我必须在子例程参数列表中使用虚拟变量“iii_”来最终设置模块变量“iii”的值。有没有办法在子例程参数列表和模块中使用相同的变量名?

  MODULE foo        
    IMPLICIT NONE
    INTEGER :: iii

    CONTAINS
      SUBROUTINE initilize(iii_)
        IMPLICIT NONE
        INTEGER :: iii_
        iii = iii_
        print *, iii
      END SUBROUTINE
  END MODULE

所以我真正想要的是:

  MODULE foo        
    IMPLICIT NONE
    INTEGER :: iii

    CONTAINS
      SUBROUTINE initilize(iii)
        IMPLICIT NONE
        [code to set subroutine iii to module iii]
        print *, iii
      END SUBROUTINE
  END MODULE

2 个答案:

答案 0 :(得分:1)

没有。您不能在同一范围内具有同名的模块变量和伪参数,后者优先,并且您将无法访问子例程中的模块变量。

但是,您可以使用第二个模块进行初始化,并使用foo中的模块变量和其他名称:

MODULE bar
  CONTAINS
    SUBROUTINE initilize(iii)
      USE foo, ONLY: iii_ => iii
      IMPLICIT NONE
      INTEGER :: iii

      iii_ = iii
    END SUBROUTINE
END MODULE

答案 1 :(得分:1)

我不知道你为什么需要这个。到目前为止,我只能看到两个选项:

  1. iii是私有的,在这种情况下,更容易给它一个不同的名称(无论如何都无法从外部访问它)

  2. iii需要可用于使用例程,在这种情况下,您可以直接设置它而不是使用单独的setter方法。

  3. 所以我认为你或任何看过这个解决方案的人都应该首先考虑他们是否以及为什么需要这个。

    那就是说,这是一个似乎有用的想法。问题是本地声明的变量iii隐藏了原始iii,因为它具有相同的名称。我使用指针给我第二次访问该模块范围的变量:

    module foo_mod
        implicit none
        integer, target :: iii
        integer, pointer, private :: p_iii => iii
    
        contains
    
            subroutine initialize(iii)
                implicit none
                integer, intent(in) :: iii
                p_iii = iii
            end subroutine initialize
    
    end module foo_mod
    
    program bar
    
        use foo_mod
        implicit none
    
        call initialize(4)
        print *, iii
    
    end program bar