你知道有一些“复杂”的方法可以实现你想要的功能。但我不会讨论那些方法,而是回答你前两个“为什么?”。
与内在赋值不同,read
语句没有将目标变量首先分配到正确的大小和类型参数以适应输入内容(如果它还没有这样)。事实上,输入列表中的项目必须被分配。Fortran 2008年9.6.3条款明确规定:
如果输入项或输出项是可分配的,则必须进行分配。
无论可分配变量是具有延迟长度的字符、具有其他延迟长度类型参数的变量还是数组,都是如此。
还有另一种声明具有延迟长度字符的方法:给它赋予pointer
属性。然而,这对你没有帮助,因为我们也看到:
如果输入项是指针,则必须将其与可定义的目标相关联...
为什么你的write
语句没有输出与你看到字符变量未分配有关:你没有遵循Fortran的要求,因此不能期望未指定的行为。
我会猜测为什么有这个限制。我看到两种明显的方法可以放宽限制:
第二种情况很容易:
如果输入项或输出项是可分配的,则应分配它,除非它是具有延迟长度的标量字符变量。
然而,这样做很笨拙,这种特殊情况似乎违背了整个标准的精神。我们还需要一个经过深思熟虑的规则来处理这种特殊情况的分配。
如果我们采用一般情况的分配,我们可能需要确保未分配的有效项是列表中的最后一个有效项:
integer, allocatable :: a(:), b(:)
character(7) :: ifile = '1 2 3 4'
read(ifile,*) a, b
然后我们就要担心
type aaargh(len)
integer, len :: len
integer, dimension(len) :: a, b
end type
type(aaargh), allocatable :: a(:)
character(9) :: ifile = '1 2 3 4 5'
read(ifile,*) a
很快就会变得非常混乱。似乎有很多问题要解决,而且有各种难度不同的方法可以解决阅读问题。
最后,我还要注意,在数据传输语句期间分配是可能的。尽管在现有规则下,当出现在派生类型的已分配变量的输入列表组件中时,必须对变量进行分配 不需要,如果该有效项由定义的输入处理,则不需要分配。