Программа получила сигнал SIGSEGV, ошибка сегментации при попытке выделить многомерный 3D массив - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в Фортране и пытаюсь решить проблему, чтобы сгруппировать несколько наборов данных, которые имеют одинаковое расстояние до точки. Я пытаюсь создать 3D-массив range_data разной длины (n, 5120) (n меняется). Я хочу сгруппировать 5 1D-массивов URS PROB ix iy и radius (имеет одинаковую длину, одинаковое местоположение индекса) в переменную range_data. Я застрял с этой ошибкой и не знаю точно, что приводит к этому. Я запустил отладчик, и он сказал, что ошибка сегментации в if (int(radius(m,1))==k) sz=sz+1

Сценарий ниже:

function radius_group(radius,dims,ix,iy,URS,PROB) result (range_data)
use typDefMod
real, dimension(:), allocatable, intent(in) :: URS,PROB
real, dimension(:,:), allocatable, intent(in) :: radius
integer,dimension(:), allocatable,  intent(in) :: ix,iy
integer :: i,k,m,sz
integer, intent(in) :: dims
type(multi_array), allocatable:: range_data,temp
integer, dimension(:), allocatable :: loc

do k=1,int(maxval(radius(:,1)))
    sz=0
    do m=1,dims
        if (int(radius(m,1))==k) sz=sz+1
    end do
    allocate(loc(sz))
    i=1
    do m=1,dims
        if (int(radius(m,1))==k) then
            loc(i)=m
            i=i+1
        end if
    end do
    allocate(temp%range_num(k)%element(sz,5))
    temp%range_num(k)%element(:,1)=radius(loc(:),1)
    temp%range_num(k)%element(:,2)=ix(loc(:))
    temp%range_num(k)%element(:,3)=iy(loc(:))
    temp%range_num(k)%element(:,4)=URS(loc(:))
    temp%range_num(k)%element(:,5)=PROB(loc(:))
    deallocate(loc)
end do
range_data=temp
end function radius_group

1 Ответ

0 голосов
/ 30 апреля 2020

вчера я решил эту проблему, это связано с отсутствующим выделением родительского массива. Но теперь я исправил это! Спасибо всем! правильный код:

function radius_group(radius,dims,ix,iy,URS,PROB) result (range_data)
    use typDefMod
    real, dimension(:), allocatable, intent(in) :: URS,PROB
    real, dimension(:,:), allocatable, intent(in) :: radius
    integer,dimension(:), allocatable,  intent(in) :: ix,iy
    integer :: i,k,m,sz
    integer, intent(in) :: dims
    type(multi_array):: range_data,temp
    type(array_R), allocatable:: range_num(:)
    real, allocatable:: element(:,:)
    integer, dimension(:), allocatable :: loc

    allocate(temp%range_num(int(maxval(radius(:,1)))))
    do k=1,int(maxval(radius(:,1)))
        sz=0
        do m=1,dims
            if (int(radius(m,1))==k) sz=sz+1
        end do
        allocate(loc(sz))
        i=1
        do m=1,dims
            if (int(radius(m,1))==k) then
                loc(i)=m
                i=i+1
            end if
        end do
        allocate(element(sz,5))
        allocate(temp%range_num(k)%element(sz,5))
        temp%range_num(k)%element(:,1)=radius(loc(:),1)
        temp%range_num(k)%element(:,2)=ix(loc(:))
        temp%range_num(k)%element(:,3)=iy(loc(:))
        temp%range_num(k)%element(:,4)=URS(loc(:))
        temp%range_num(k)%element(:,5)=PROB(loc(:))
        deallocate(loc)
        deallocate(element)
    end do
    range_data=temp
end function radius_group
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...