【问题标题】:Use variable from fortran subroutine argument list to set module variable of the same name使用 fortran 子例程参数列表中的变量来设置同名的模块变量
【发布时间】:2015-09-11 10:55:03
【问题描述】:

我在一个名为的 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

【问题讨论】:

    标签: module fortran


    【解决方案1】:

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

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

    2. iii 需要可用于 using 例程,在这种情况下,您可以直接设置它,而不是使用单独的 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 和虚拟变量混淆。
    【解决方案2】:

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

    但是,您可以拥有一个仅用于初始化的第二个模块,并使用来自 foo 的模块变量和另一个名称:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多