2015-03-08 2 views
3

Я обновляя старую программу в 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?

+0

На первый взгляд, он действительно выглядит как ошибка gfortran. Можете ли вы подать PR под https://gcc.gnu.org/bugzilla/? –

+0

@tkoenig: К сожалению, я не уверен, как это сделать ... Должен ли я сделать там счет? И кстати, что означает PR? – filipr

ответ

1

Это очень похоже на ошибку в gfortran. Я представил PR 65359 для этого (PR для «Отчет о проблеме»).

+0

Недавно я просмотрел этот отчет об ошибке в PR 65359 и снова попробовал эту программу с gfortran 5.3, и он все еще не работает. Не могли бы вы объяснить мне, почему никто не был назначен на эту ошибку? Является ли этот пример каким-то нестандартным (никто не использует такие конструкции), или это просто потому, что никто больше не заботится о fortran? – filipr

Смежные вопросы