2017-02-03 10 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 인 경우 코드가 완벽하게 실행됩니다. 즉, nblock ie를 늘리면됩니다. 2로 설정하면 메모리 문제가 발생합니다. 그게 어떻게 가능해?파생 형식 배열에 배열 구성 요소를 할당 한 후 오류가 발생했습니다.

+0

코드의 간격을 줄이면 모든 빈 줄이 따라 다니기 어렵습니다. – francescalus

+2

"기억 상 문제가 있습니다"와 같은 불확실한 문구를 사용하지 마십시오. 오류 메시지가 인쇄되면 질문에 붙여 넣으십시오. 읽기 [ask] –

답변

2

파생 형식의 배열 구성 요소 할당에 대해 살펴 보겠습니다. 특히 메인 프로그램의 라인

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

이것은 당신이 생각하는대로하지 않는 것 같습니다.

여기서 일어나는 일은 nblock의 구성 요소 wblock 인 할당됩니다. nblock 구성 요소가 block 인 것은 아닙니다. 해당 크기에 할당 된 모두입니다. 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을 할당 할 것을 제안합니다.