【问题标题】:Error after allocating array components in a derived type array在派生类型数组中分配数组组件后出错
【发布时间】:2017-02-03 09:22:40
【问题描述】:
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 它会产生内存问题。怎么可能?

【问题讨论】:

  • 请注意减少代码的间距,因为所有这些空白行都难以理解。
  • 请不要使用不确定的短语,例如“它会导致记忆问题”。如果它打印一些错误消息,请将其粘贴到您的问题中。阅读How to Ask

标签: fortran gfortran fortran95


【解决方案1】:

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

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

这似乎不是你想象的那样。

这里发生的是分配了block 的元素nblock 的组件w。这并不是说blocknblock 组件全部 分配给该大小。当nblock为1时,效果一样:没问题。

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

【讨论】:

  • 这就像fortan90的ABC,谢谢你记得。抱歉这个愚蠢的问题。
【解决方案2】:

改变

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 2020-03-17
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2017-04-25
    • 2016-03-27
    相关资源
    最近更新 更多