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