Ошибка после размещения компонентов массива в массиве производного типа

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 это дает проблемы с памятью. Как это возможно?


person atelcikti1    schedule 03.02.2017    source источник
comment
Пожалуйста, обратите внимание на уменьшение интервалов в вашем коде, так как все эти пустые строки затрудняют понимание.   -  person francescalus    schedule 03.02.2017
comment
Пожалуйста, не используйте неопределенные фразы, так как это может привести к проблемам с памятью. Если он печатает какое-то сообщение об ошибке, вставьте его в свой вопрос. Прочитайте Как спросить   -  person Vladimir F    schedule 03.02.2017


Ответы (2)


Давайте посмотрим на размещение компонентов массива производного типа. В частности строка в основной программе

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

Кажется, это не то, что вы думаете.

Здесь происходит следующее: выделяется компонент w элемента nblock элемента block. Это не означает, что nblock компонентов block все распределены по этому размеру. Когда nblock равно 1, эффект тот же: никаких проблем.

Вам нужно выделить компонент каждого элемента отдельно. Это имеет смысл, так как часто хотелось бы, чтобы каждый элемент имел компоненты разного размера или разный статус распределения. Для этого есть несколько подходов, но я не буду их здесь описывать: для этого есть другие вопросы.

person francescalus    schedule 03.02.2017
comment
Это как азбука fortan90, спасибо, что помните. Извините за этот глупый вопрос. - person atelcikti1; 07.02.2017

Сдача

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

to

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

В текущем коде вы выделяете только один элемент block: либо block(1)%w(10), если nblock=1, либо block(2)%w(10), если nblock=2. С модификацией, которую я предлагаю, вы разместите массив w внутри каждого элемента block.

person Pierre de Buyl    schedule 03.02.2017