模块或主程序数组在Fortran中必须具有恒定的形状错误

时间:2017-08-16 11:01:03

标签: arrays fortran gfortran

模块中声明的整数变量用作全局变量,用于定义程序中相关数组的大小。程序的大小各不相同,因此数组的大小是变量而不是参数。它在程序开始时确定。

在下面的代码片段中,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

1 个答案:

答案 0 :(得分:2)

声明为a(n)的数组是显式形状数组。当n不是常量(命名或其他,严格地说是常量表达式)时,这样的数组是自动对象

自动对象受限于可能出现的位置。特别是,显式形状数组受以下约束条件(F2008的C531):

  

其bounds不是常量表达式的explicit-shape-spec应仅出现在子程序,派生类型定义,BLOCK构造或接口体中。

由于模块n中的mod不是常量,因此它不能用作主程序中数组的边界。子例程sub是一个子程序,因此a(n)是非常量边界的有效使用。

可以使用pointerallocatable属性,而不是主程序中的自动对象,而是考虑延迟形状数组。