0

以下

 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 我得到了正确的行为。

4

0 回答 0