在 Fortran 中初始化参数化派生类型的参数大小数组?

kdb*_*kdb 6 fortran

Fortran 允许参数化派生类型元素的大小。但是,在固定大小的元素可以在类型声明中分配默认值的情况下,参数化条目似乎没有办法:

PROGRAM main
  IMPLICIT NONE

  TYPE data1
     INTEGER :: array(5) = 2   ! allowed
  END type data1

  TYPE data2(n)
     INTEGER, LEN :: n
     INTEGER :: array(n) = 2   ! incorrect: error #8737 with intel fortran 19,
  END type data2               !            ignored by gfortran 8.2.1

END PROGRAM main
Run Code Online (Sandbox Code Playgroud)

分配默认值很方便,因为它可以避免每次使用类型时重复初始化,但对于参数大小的字段,这是不允许的;Gfortran 只是默默地忽略默认值,并且 Intel Fortran 发出错误

error #8737: For a default initialized component every type parameter and array bound
             must be a constant expression.   [ARRAY]
Run Code Online (Sandbox Code Playgroud)

是否有任何语法允许定义默认值?

fra*_*lus 2

此类组件不能有默认初始化。

正如 Intel Fortran 错误消息所述,具有初始化表达式的组件的数组边界必须是常量表达式(这是 Fortran 2018 的约束 C762)。length 类型参数不能用作常量表达式。

没有其他语法可以指定组件的默认值。

种类类型参数可以出现在常量表达式中,因此具有由该类型的种类参数给出的边界的组件可以具有默认初始化。