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

标签 module fortran global-variables allocatable-array

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

关于module - 如何跨子例程处理模块中的 Fortran 全局可分配变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859699/

相关文章:

java - 从运行时加载的 java 9 模块加载类时出现 ClassNotFoundException

arrays - gdb:打印二维fortran数组

python - 在 Tornado 类中传递全局变量

module - Prestashop AJAX 调用模块

python - 如何指定 bash 环境以使用 Python 的 Numeric 模块?

python - 使用 Homebrew 软件为 numpy 安装 gfortran

javascript - 为什么我的函数不能识别我的全局变量? (JavaScript)

python - 首次使用后重新分配时局部变量出现 UnboundLocalError

F#代码组织: types & modules

fortran - 具有重载赋值的嵌套派生类型