如何处理跨子例程中模块中的Fortran全局可分配变量



i具有以下模块,该模块具有可分配变量,该变量在模块中定义,分配在子例程中,然后在第一个子例程中称为第二个子例程中。在这种情况下,我是否必须将变量传递给第二个子例程并声明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

我必须将变量传递给第二个子例程并声明INTENT(inout)

不,你不。默认情况下,模块正文中的任何变量贬值都具有save属性。但是,您必须确保仅在执行第一个子例程后才调用第二个子例程,否则该程序将失败,因为total尚未初始化。

在模块中声明的所有功能和子例程都可以通过主机协会访问total


顺便说一句,您应该在代码中解决一些问题,如@pierredebuyl在评论中所述:

  • 默认情况下,在模块主体中声明的变量被保存;您应该删除SAVE语句。
  • 在模块中声明的过程从模块范围继承了IMPLICIT指令,如果您不更改它,则无需在子例程中重新计算。
  • 您缺少my_subr1中的参数声明。

相关内容

  • 没有找到相关文章

最新更新