我在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
答案 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)
我不知道你为什么需要这个。到目前为止,我只能看到两个选项:
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