【问题标题】:Module or main program array must have constant shape error in Fortran模块或主程序数组在 Fortran 中必须具有恒定的形状错误
【发布时间】:2017-08-16 11:01:02
【问题描述】:

模块中声明的整型变量作为全局变量来定义程序中相关数组的大小。程序的大小不同,所以数组的大小是一个变量而不是参数。它是在程序开始时确定的。

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

【问题讨论】:

  • 在声明integer :: b(n)时n的值是未知的,所以你应该使用类似:integer, pointer : b(:); n = 5; allocate(b) 或整数,参数 :: nn = 5;整数 :: a(nn); n = nn

标签: arrays fortran gfortran


【解决方案1】:

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

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

其边界不是常量表达式的显式形状规范应仅出现在子程序、派生类型定义、BLOCK 构造或接口主体中。

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

除了在主程序中使用自动对象外,还可以考虑延迟形状数组,使用pointerallocatable 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2015-11-24
    • 2019-03-16
    • 1970-01-01
    相关资源
    最近更新 更多