【发布时间】:2016-04-13 12:16:07
【问题描述】:
这是主程序的一部分
PROGRAM program1
USE method
USE variables
IMPLICIT NONE
:
CALL method_init(A,a1end,C)
:
END PROGRAM program1
对 method_init 的调用,包含在模块 method 中,“初始化”了一个方法,它构建数组 a1end 和 C 形成数组 A(对包含在模块应遵循)。
数组a1end 和C 是方法的一部分,所以它们都在method 模块中声明;数组A 不是方法的一部分(它可以用另一种方法“解决”),所以它在模块variables 中声明。
数组C 和a1end 可以被不包含在method 模块中的子例程使用,因此必须在CONTAINS 语句之前声明它们。
因此,method 模块中包含的子例程可以使用这些变量而不将它们用作输入/输出变量,但这会使子例程的作用不清楚(调用将简单地为CALL method_init,所以“这个子例程如何操作?它使用了哪些数组?修改了哪些?..."),所以我更喜欢调用 CALL method_init(A,a1end,C)。
这表示模块method是这样的
MODULE method
IMPLICIT NONE
REAL, DIMENSION(:,:), ALLOCATABLE :: C ! declared here to be used...
REAL, DIMENSION(:,:), ALLOCATABLE :: a1end ! ...by procedures outside this module
:
CONTAINS
SUBROUTINE method_init(A,a1end,C)
IMPLICIT NONE
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(IN) :: A ! deferred shape (it's allocated elsewhere in the main program)j
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: C ! declared here to be used...
REAL, DIMENSION(:,:), ALLOCATABLE, INTENT(OUT) :: a1end ! ...as input/output variables
:
ALLOCATE(C( ),a1end( ))
:
END SUBROUTINE method_init
END MODULE method
我想知道这是否是一种正确的编程方式。只是口味问题?
编辑简而言之,问题是: 将模块中定义的变量用作模块本身包含的过程的输入/输出参数是一种正确的编程方式吗?还是最好编写不带参数的子程序?还是一切都只是品味问题?
@Vladimir F 链接的问题/答案让我认为是的,这是一个品味问题。尽管如此,这些问题都没有触及我感兴趣的特定点(即模块中的过程并使用模块中定义的变量作为输入/输出参数)。
【问题讨论】:
-
很久没看FORTRAN了。它伤害了我的眼睛。请阅读常见问题解答,了解哪些问题适用于 SO。基于意见的问题不是,因为它不是一个讨论板。
-
在我有空的时间内,我无法清楚地遵循您所写的内容,但是您对范围的概念有疑问:本地虚拟变量和模块变量吗?
-
我不会那样做,可能宁愿使用派生数据类型和程序中直接声明的实际变量,但你的代码是合法的 Fortran。
标签: module scope fortran subroutine