Fortran 在派生类型数组中分配数组组件后出错
这是我的问题。对于nblock=1,代码运行良好,但是,如果我将nblock ie.增加到2,则会出现内存问题。怎么可能呢?让我们看看派生类型的数组组件的分配。特别是主程序中的行Fortran 在派生类型数组中分配数组组件后出错,fortran,gfortran,fortran95,Fortran,Gfortran,Fortran95,这是我的问题。对于nblock=1,代码运行良好,但是,如果我将nblock ie.增加到2,则会出现内存问题。怎么可能呢?让我们看看派生类型的数组组件的分配。特别是主程序中的行 module sdata integer, parameter :: nblock = 2 TYPE block_info REAL, ALLOCATABLE :: w(:) END TYPE block_info TYPE(block_info), TARGE
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
的组件w
。这并不是说nblock
块的nblock
组件都被分配到该大小。当nblock
为1时,效果相同:没有问题
您需要单独分配每个元素的组件。这是有道理的,因为人们通常希望每个元素具有不同大小的组件,或者不同的分配状态。有几种方法可以实现这一点,但我在这里不讨论这些方法:还有其他问题。让我们看看派生类型的数组组件的分配。特别是主程序中的行
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
的组件w
。这并不是说nblock
块的nblock
组件都被分配到该大小。当nblock
为1时,效果相同:没有问题
您需要单独分配每个元素的组件。这是有道理的,因为人们通常希望每个元素具有不同大小的组件,或者不同的分配状态。有几种方法可以做到这一点,但我在这里不讨论这些:还有其他问题。改变
allocate(block(nblock)%w(10))
到
在当前代码中,只分配块的一个元素:如果nblock=1
则分配块(1)%w(10)
,如果nblock=2
则分配块(2)%w(10)
。通过修改,我建议您将在块的每个元素内分配一个数组w
更改
allocate(block(nblock)%w(10))
到
在当前代码中,只分配块的一个元素:如果nblock=1
则分配块(1)%w(10)
,如果nblock=2
则分配块(2)%w(10)
。修改后,我建议您在块的每个元素内部分配一个数组w
。请注意减少代码的间距,因为所有这些空行都很难理解。请不要使用不确定的短语,如“它会导致内存问题”。如果它打印了一些错误消息,请将其粘贴到您的问题中。阅读请注意减少代码的间距,因为所有这些空行都会让人难以理解。请不要使用不确定的短语,如“它会导致内存问题”。如果它打印了一些错误消息,请将其粘贴到您的问题中。阅读这篇文章就像是fortan90的ABC,谢谢你记住它。抱歉这个愚蠢的问题。这就像fortan90的ABC一样,谢谢你记住它。对不起,这个愚蠢的问题。