考虑以下Fortran程序:
program test
character(len=:), allocatable :: str
allocate(character(3) :: str)
print *, len(str)
str = '12345'
print *, len(str)
end program
当我运行时,我得到了预期的结果:
3
5
也就是说,当str设置为'12345'时,字符串的大小从3调整为5。相反,如果我使用动态字符串数组,则不然。例如:
program test
character(len=:), allocatable :: str(:)
allocate(character(3) :: str(2))
print *, len(str(1)), len(str(2))
str(1) = '12345'
print *, len(str(1)), len(str(2))
end program
当我跑步时,我得到:
3 3
3 3
因此str(1)的集合没有改变字符串的长度。我使用ifort 16.0.2和gfortran 5.3.1获得了相同的行为。我的问题是这种行为是否与最新的Fortran标准一致,或者这是编译器中的错误?
答案 0 :(得分:5)
这是正确的行为。可分配数组的元素本身不是可分配变量,不能在赋值时(或以任何其他方式)重新分配。此外,所有数组元素必须具有相同的类型 - 包括字符串长度。
答案 1 :(得分:1)
扩展@Vladimir F的答案,您可以通过对代码进行一些更改来实现您的想法,如下所示(创建一个锯齿状的字符向量数组):
program test
type :: CherVec_type
character(len=:), allocatable :: str
end type CherVec_type
type(CherVec_type) :: JaggedArray(2)
allocate(character(3) :: JaggedArray(1)%str)
allocate(character(3) :: JaggedArray(2)%str)
print *, len(JaggedArray(1)%str), len(JaggedArray(2)%str)
JaggedArray(1)%str = "12345"
print *, len(JaggedArray(1)%str), len(JaggedArray(2)%str)
end program
创建以下输出:
$gfortran -std=f2008 *.f95 -o main
$main
3 3
5 3