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

Module 使用fortran子程序参数列表中的变量设置同名的模块变量,module,fortran,Module,Fortran,我在一个名为的Fortran模块中定义了一大堆变量。我想有一个子程序,最简单的是,将模块级变量初始化为用户提供的变量。下面的简化代码可以工作,但是,我不得不在子例程参数列表中使用一个伪变量“iii_2;”,以最终设置模块变量“iii”的值。有没有办法在子程序参数列表和模块中使用相同的变量名 MODULE foo IMPLICIT NONE INTEGER :: iii CONTAINS SUBROUTINE initilize(iii_)

我在一个名为的Fortran模块中定义了一大堆变量。我想有一个子程序,最简单的是,将模块级变量初始化为用户提供的变量。下面的简化代码可以工作,但是,我不得不在子例程参数列表中使用一个伪变量“iii_2;”,以最终设置模块变量“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

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

但是,您可以使用第二个模块进行初始化,并将
foo
中的模块变量与另一个名称一起使用:

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

      iii_ = iii
    END SUBROUTINE
END MODULE

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

  • iii
    是私有的,在这种情况下,给它起一个不同的名字会更容易(你无论如何都不能从外部访问它)

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

  • 所以我认为你,或者任何正在研究这个解决方案的人,应该首先认真思考他们是否需要这个,以及为什么需要这个

    这就是说,这里有一个想法似乎是可行的。问题是本地声明的变量
    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
    

    为了解释我为什么要这样做:我有一个python类,它可以进行大量的计算,但是计算速度很慢,所以我正在尝试编写一个fortran扩展来完成所有的繁重工作。参考我的简化示例,我的python类已经有了一个变量“self.iii”。当我在python类中调用foo时,我想用foo(self.iii)或foo(iii=self.iii)来调用它。如果可能的话,我不想与下划线、p和伪变量混淆。