如何跨子例程处理模块中的 Fortran 全局可分配变量
How to handle Fortran global allocatable variables in a module across subroutines
我有一个带有可分配变量的模块,该变量在模块中定义,在子例程中分配,然后也用于第一个子例程调用的第二个子例程。在这种情况下,我是否必须将变量传递给第二个子程序并声明 INTENT(inout)
?或者因为它是一个全局变量,所以不需要作为参数传递?
MODULE test
IMPLICIT NONE
SAVE
REAL,ALLOCATABLE,DIMENSION(:,:,:) :: total
CONTAINS
!--- 1st subroutine
SUBROUTINE my_subr1(n,m,z)
IMPLICIT NONE
INTEGER,INTENT(in) :: n,m,z
ALLOCATE(total (n,m,z))
total=.9
CALL my_subr2(n)
END SUBROUTINE my_subr1
!-- 2nd subroutine
SUBROUTINE my_subr2(n)
IMPLICIT NONE
INTEGER,INTENT(in) :: n
total(n,:,:)=total(n-1,:,:)
END SUBROUTINE my_subr2
END MODULE test
do I have to pass the variable to the second subroutine and declare INTENT(inout)
?
不,你不知道。默认情况下,模块主体中贴标的任何变量都具有 save
属性。但是,您必须确保仅在第一个子例程执行后才调用第二个子例程,否则程序将失败,因为 total
尚未初始化。
模块中声明的所有函数和子例程都可以通过主机关联访问 total
。
顺便说一下,正如@PierredeBuyl 在评论中提到的,您应该在代码中解决一些问题:
- 默认保存模块体中声明的变量;您应该删除
SAVE
语句。
- 在模块中声明的过程从模块范围继承
IMPLICIT
指令,如果您不更改它,则无需在子例程中重新声明它。
- 您缺少
my_subr1
中参数的声明。
我有一个带有可分配变量的模块,该变量在模块中定义,在子例程中分配,然后也用于第一个子例程调用的第二个子例程。在这种情况下,我是否必须将变量传递给第二个子程序并声明 INTENT(inout)
?或者因为它是一个全局变量,所以不需要作为参数传递?
MODULE test
IMPLICIT NONE
SAVE
REAL,ALLOCATABLE,DIMENSION(:,:,:) :: total
CONTAINS
!--- 1st subroutine
SUBROUTINE my_subr1(n,m,z)
IMPLICIT NONE
INTEGER,INTENT(in) :: n,m,z
ALLOCATE(total (n,m,z))
total=.9
CALL my_subr2(n)
END SUBROUTINE my_subr1
!-- 2nd subroutine
SUBROUTINE my_subr2(n)
IMPLICIT NONE
INTEGER,INTENT(in) :: n
total(n,:,:)=total(n-1,:,:)
END SUBROUTINE my_subr2
END MODULE test
do I have to pass the variable to the second subroutine and declare
INTENT(inout)
?
不,你不知道。默认情况下,模块主体中贴标的任何变量都具有 save
属性。但是,您必须确保仅在第一个子例程执行后才调用第二个子例程,否则程序将失败,因为 total
尚未初始化。
模块中声明的所有函数和子例程都可以通过主机关联访问 total
。
顺便说一下,正如@PierredeBuyl 在评论中提到的,您应该在代码中解决一些问题:
- 默认保存模块体中声明的变量;您应该删除
SAVE
语句。 - 在模块中声明的过程从模块范围继承
IMPLICIT
指令,如果您不更改它,则无需在子例程中重新声明它。 - 您缺少
my_subr1
中参数的声明。