在派生类型数组中分配数组组件后出错

时间:2017-02-03 09:22:40

标签: fortran gfortran fortran95

module sdata

    integer, parameter :: nblock = 2

    TYPE block_info

        REAL, ALLOCATABLE :: w(:)

    END TYPE block_info

    TYPE(block_info), TARGET :: block(nblock)

end module sdata





module variable

    use sdata

    REAL, POINTER :: w(:)

contains

    !.............................
    subroutine set_current(n)

    nullify(w)
    allocate(w(10))

    w(1:10)  => block(n)%w(1:10)

    end subroutine set_current
    !.............................

end module variable


subroutine make_sth

use variable
use sdata

real,allocatable,dimension(:)::wm,wp,ww
integer n

allocate(wm(5),wp(5),ww(5))


do n = 1,nblock

    block(n)%w(1:10) = (/ 1.,2.,3.,4.,5.,6.,7.,8.,9.,10./)

    call set_current(n)

    wp(1:5) = w(1:5)
    wm(1:5) = w(6:10)

    ww = wp + wm

    do i = 1,5
        print*, 'block = ',n,'ww = ',ww(i)
    enddo

enddo

end subroutine make_sth


program main

use variable
use sdata

allocate(block(nblock)%w(10))

call make_sth

end program main

这是我的问题。对于nblock = 1代码完全正常运行,但是,如果我增加nblock即。到2它给出了记忆问题。怎么可能?

2 个答案:

答案 0 :(得分:2)

让我们看一下派生类型的数组组件的分配。特别是主程序中的行

allocate(block(nblock)%w(10))

这似乎不是你认为的那样。

这里发生的是w的元素nblock的组件block被分配。并不是说nblock的{​​{1}}组件全部分配给该大小。当block为1时,效果相同:没问题。

您需要单独分配每个元素的组件。这是有道理的,因为人们通常希望每个元素具有不同大小的组件或不同的分配状态。有几种方法,但我不会在这里讨论:还有其他问题。

答案 1 :(得分:1)

更改

allocate(block(nblock)%w(10))

do i = 1, nblock
    allocate(block(i)%w(10))
end do

在您当前的代码中,您只分配block一个元素:如果block(1)%w(10)则为nblock=1,如果为block(2)%w(10)则为nblock=2 }。根据我提议的修改,您将在w的每个元素内部分配一个数组block