模块中声明的整数变量用作全局变量,用于定义程序中相关数组的大小。程序的大小各不相同,因此数组的大小是变量而不是参数。它在程序开始时确定。
在下面的代码片段中,n
是全局大小变量。它在模块中声明并在主函数/程序的开头定义。类似于主程序中的n
和主程序中包含的子程序分别初始化数组。但是,主程序中的初始化会导致错误:模块或主程序数组必须具有恒定的形状错误,但子程序中的初始化起作用。在不同位置使用的非常数值的这种不同处理背后的机制是什么?
module mod
implicit none
integer :: n
end module mod
program main
use mod
implicit none
integer :: b(n)
n = 5
b(:) = 1
print*, b(:)
call sub
contains
subroutine sub
integer :: a(n)
a = 10
print*, a
end subroutine sub
end program main
答案 0 :(得分:2)
声明为a(n)
的数组是显式形状数组。当n
不是常量(命名或其他,严格地说是常量表达式)时,这样的数组是自动对象。
自动对象受限于可能出现的位置。特别是,显式形状数组受以下约束条件(F2008的C531):
其bounds不是常量表达式的explicit-shape-spec应仅出现在子程序,派生类型定义,BLOCK构造或接口体中。
由于模块n
中的mod
不是常量,因此它不能用作主程序中数组的边界。子例程sub
是一个子程序,因此a(n)
是非常量边界的有效使用。
可以使用pointer
或allocatable
属性,而不是主程序中的自动对象,而是考虑延迟形状数组。