4

这编译正确:

type t1
    integer :: a, b(2), c
end type t1
type(t1), parameter :: t1a = t1(1, [2, 3], 4)

我想写这样的东西,除了它不编译:

type t2
    integer :: a
    integer, allocatable :: b(:)
    integer :: c
end type t2
type(t2), parameter :: t2a = t2(1, [2, 3], 4) ! compile error
type(t2), parameter :: t2b = t2(1, [2, 3, 4], 5) ! compile error

gfortran 错误信息

Error: Invalid initialization expression for ALLOCATABLE component 'b' in structure constructor

没有给我任何关于正确语法的线索。

我没有收到任何关于尝试使用可分配类型声明参数变量的抱怨,所以我认为必须有某种方法来初始化它!

4

2 回答 2

3

我认为你假设错了。2008 标准明确禁止初始化可分配实体 (R503/C506),我怀疑它也禁止初始化作为派生类型的组件的可分配实体,尽管我找不到支持我的怀疑的章节和经文。

于 2015-09-30T22:10:40.313 回答
1

用于设置命名常量值或变量初始值的表达式是常量表达式。要成为常量表达式,使用结构构造函数的表达式受到限制 (Fortran 2018 10.1.12 p1 3a) 1这意味着

对应于可分配组件的每个组件规范都是对内部函数 NULL 的引用

这意味着您不能拥有一个已分配的可分配组件的命名常量,并且最初未分配变量的可分配组件。


1在 Fortran 2003 中,由于对问题进行了额外标记,因此使用初始化表达式的术语明显不同,但适用等效限制。

于 2021-10-17T00:00:23.550 回答