3

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

1 回答 1

5

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

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

模块中声明的所有函数和子例程都可以total通过主机关联访问。


顺便说一句,正如@PierredeBuyl 在评论中提到的那样,您应该在代码中解决一些问题:

  • 模块体中声明的变量默认保存;您应该删除该SAVE声明。
  • 在模块中声明的过程从模块范围继承IMPLICIT指令,如果您不更改它,则无需在子例程中重新声明它。
  • 您缺少my_subr1.
于 2019-02-25T09:51:34.600 回答