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它给出了记忆问题。怎么可能?
答案 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
。