以下代码在GFortran和Intel Fortran中均给出错误,但看起来完全合理且毫不含糊。
GFortran错误为
具有非零等级的零件引用右侧的组件不得具有可分配的属性
program vls
type :: tString
character(:), allocatable :: S
end type
type(tString) :: Strings(2)
Strings%S = 'xxx'
end program
我无法分配给可分配的数组,但不能分配给可分配的标量。这真的是标准所要求的吗?
答案 0 :(得分:0)
您只是在“快速移动”。 Strings
是tString
类型的向量,长度为2。
您不能直接分配给Strings%S
(这可能松散地对应于向量S
中的所有属性Strings
。
例如,将第一项分配为Strings(1)%S
。
program vls
type :: tString
character(:), allocatable :: S
end type tString
type(tString) :: Strings(2)
Strings(1)%S = 'xxx'
write(*,*) Strings(1)%S
end program vls
答案 1 :(得分:0)
是的,该禁令适用于任何可分配的对象,而不仅仅是数组。在Fortran 2018中,这是约束C919:
排名不为零的 part-ref 不得超过一个。具有非零等级的 part-ref 右侧的 part-name 不应具有ALLOCATABLE或POINTER属性
对于延迟长度的此组件,在接受延迟大小数组的限制时,很难接受它被允许。但是,即使可分配属性的长度恒定(即使长度为1),也是不允许的。