Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 在派生类型数组中分配数组组件后出错_Fortran_Gfortran_Fortran95 - Fatal编程技术网

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

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

这是我的问题。对于nblock=1,代码运行良好,但是,如果我将nblock ie.增加到2,则会出现内存问题。怎么可能呢?

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

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一样,谢谢你记住它。对不起,这个愚蠢的问题。