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
指定默认值很方便,因为它允许避免每次使用类型时重复初始化,但对于参数大小的字段,这是不允许的;Gfortran会默默地忽略默认值,而Intel Fortran则会发出错误。
error #8737: For a default initialized component every type parameter and array bound
must be a constant expression. [ARRAY]
有没有一种语法,可以在所有内容之后定义默认值?
TYPE MEMBER (NAME_LEN) ; INTEGER, LEN :: NAME_LEN ; CHARACTER (LEN = NAME_LEN) :: NAME = '' ; ...
。这显示了组件初始化,其中类型参数用于规范表达式。标准明确指出“在派生类型定义中,类型参数可以用作规范表达式(10.1.11)中的主要表达式。”如果您转到10.1.11,则会发现“受限制的表达式是一个表达式...每个主要表达式都是...(13)正在定义的派生类型的类型参数”。 - evetsname_len
是定义该组件的类型的类型参数时,将非常量的name_len
用作字符组件长度的规范表达式是自然允许的。但是,当涉及到默认初始化时,规范表达式并不重要。C762是一个额外的约束条件,这意味着类型参数和数组边界必须是常量表达式,而不是规范表达式。 - francescaluscharacter(name_len) :: name=''
。但是我也看到了 C762,如果它与注释中的示例存在冲突(即使该注释是规范性的),则必须使用 C762。您对 C762 的看法是什么?为什么它在这种情况下不适用? - francescalusinteger :: array(n)=0
(但不包括integer :: array(n+0)=0
、integer :: array(2:n+1)=0
或integer :: array(n)=[(i,i=1,n)]
),但我认为在示例中错误地将长度参数设置为非常量更有可能。 - francescalus