Я обновляя старую программу в Fortran90 в объективном смысле и я наткнулся на довольно странное поведение наследуемых объектов: В качестве примера:Используя (1: N) с унаследованными классами работает удачливый в gfortran
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
Altough 1-я и 2-й ряда (соответственно 3 и 4) должен быть одинаковыми. Похоже, что есть некоторая проблема с распределением памяти для наследуемых объектов, так как эта проблема исчезает, если я комментирую объявление переменной j (в InnerSpec_t). Если скомпилировано с intel fortran, все работает нормально.
Я использую как-то несоответствующие конструкции? Есть ли способ сделать эту работу даже для gfortran?
На первый взгляд, он действительно выглядит как ошибка gfortran. Можете ли вы подать PR под https://gcc.gnu.org/bugzilla/? –
@tkoenig: К сожалению, я не уверен, как это сделать ... Должен ли я сделать там счет? И кстати, что означает PR? – filipr