3

私は客観的な方法で fortran90 の古いプログラムを更新してきましたが、継承されたオブジェクトの非常に奇妙な動作に遭遇しました: 例として:

module try_mod

implicit none

type, public :: Inner_t
  integer :: i
  real :: r
end type Inner_t

type, public, extends(Inner_t) :: InnerSpec_t
  integer :: j
end type InnerSpec_t

type, public :: Outer_t
  integer :: nelem
  class( Inner_t ), allocatable, dimension(:) :: elem

contains
  procedure :: init => initOuter

end type Outer_t


contains

 subroutine initOuter(this)
  class(Outer_t), intent(inout) :: this
  integer :: i, suma, k

  this%nelem = 4

  allocate( InnerSpec_t :: this%elem(1:this%nelem) )


  this%elem(1:2)%i = -100
  this%elem(3:4)%i = -200


  print*, '1st: ', this%elem(1:this%nelem)%i
  print*, '2nd: ', this%elem(1)%i, this%elem(2)%i, this%elem(3)%i, this%elem(4)%i

  this%elem(1)%i = 91 
  this%elem(2)%i = 92 
  this%elem(3)%i = 93
  this%elem(4)%i = 94 
  print*,'3rd: ', this%elem(1:4)%i
  print*,'4th: ', this%elem(1)%i, this%elem(2)%i, this%elem(3)%i, this%elem(4)%i



end subroutine initOuter

end module try_mod 

program adgo
  use try_mod

implicit none

  type( Outer_t ) :: outer

  call outer%init()
end program

このプログラムを gfortran (4.8 または 4.9) でコンパイルすると、

 1st:         -100        -100        -200        -200
 2nd:         -100       32751        -200  1852387182
 3rd:           91        -100        -200          93
 4th:           91          92          93          94

ただし、1 行目と 2 行目 (それぞれ 3 行目と 4 行目) は同じである必要があります。変数 j (InnerSpec_t 内) の宣言をコメント化すると、この問題は解消されるため、継承されたオブジェクトのメモリ割り当てに問題があるようです。intel fortran でコンパイルすると、すべて正常に動作します。

どういうわけか不適切な構文を使用していますか? gfortranでもこれを機能させる方法はありますか?

4

1 に答える 1

1

これは、gfortran のバグによく似ています。これについてPR 65359を提出しました (PR は「問題レポート」です)。

于 2015-03-09T10:05:01.057 に答える