2017-02-03 3 views
0
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の場合、コードは完全に実行されています。 2にするとメモリの問題が発生します。どのように可能ですか?派生型配列に配列コンポーネントを割り当てた後のエラー

+0

あなたのコードのスペースを減らすことに注意してください。すべての空白行がそれに追従しにくいからです。 – francescalus

+2

「メモリに問題があります」といった不明なフレーズは使用しないでください。エラーメッセージが表示された場合は、質問に貼り付けてください。 [ask] –

答えて

2

派生型の配列コンポーネントの割り当てを見てみましょう。特に

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

メインプログラム内の行は、これは、あなたがそれはそれはそう、だと思う何をしていません。

ここでは、nblockのコンポーネントwblockに割り当てられます。 blocknblockコンポーネントがであり、そのサイズに割り当てられたすべてがであるとは限りません。 nblockが1の場合、効果は同じです。問題ありません。

各要素のコンポーネントを個別に割り当てる必要があります。これは、各要素が異なるサイズのコンポーネントを持つか、またはさまざまな割り当てステータスを持つことがよくあるように、理にかなっています。これにはいくつかのアプローチがありますが、ここではそれらについては触れません。それには他にも質問があります。

+0

を読んでください。これはfortan90のABCのようなものです。覚えてくれてありがとう。この愚かな質問を申し訳ありません。 – atelcikti1

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もしあれば。私が提案した修正では、blockの各要素に配列wを割り当てます。

関連する問題