以下
type t
real :: r(2)
end type t
class(t), allocatable :: array(:)
allocate(array(1))
array(1)%r(1) = 1
array(1)%r(2) = 2
print*,array(1)%r
end program
打印不正确
1.00000000 0.00000000
使用 gfortran-4.8.1。无论数组大小如何,我都只能正确设置第一个元素。所有其他分配均无效。没有给出警告。这是编译器错误吗?使用英特尔编译器,它可以正确打印
1.000000 2.000000
编辑
抱歉,上述内容虽然可能是编译器错误,但却是对我的实际问题的过度简化。实际上,我有一个可分配数组,其元素继承自抽象类型。
module m
type, abstract :: base
real, allocatable :: r(:)
contains
procedure :: print
end type base
type, extends(base) :: t
end type t
contains
subroutine print(this, n)
class(base) :: this
integer n
print*,this%r(n)
end subroutine print
end module m
program test
use m
class(base), allocatable :: array(:)
type(t) :: f
allocate(array(1), mold=f)
allocate(array(1)%r(2))
array(1)%r(1) = 1.0
array(1)%r(2) = 2.0
call array(1)%print(1)
call array(1)%print(2)
end program test
结果是
1.00000000
0.00000000
使用 gfortran 但应该是
1.00000000
2.00000000
与 ifort 一样。使用 base-bound 集合函数,而不是直接定义 'r',会产生正确的结果。上面的代码中有什么不标准的或者只是一个编译器错误?
更新
这个问题现在似乎已经解决了。引入修复程序时我不这样做,但是使用 GFortran 10.2.0 我得到了正确的行为。