Fortran: SIGSEGV после успешного создания массива указателей - PullRequest
0 голосов
/ 04 сентября 2018

Вопрос на Фортране: я успешно создал массив указателей, которые указывают на элементы в массиве объектов

Компилятор gcc/5.4.0

Примечание:

Использование gcc/6.4.0 эта проблема решена.

варианты:

>>gfortran -fdefault-real-8 -o H -fbacktrace -g -fcheck=all pointersToObjects.f90
>>./H

вот картинка моей проблемы enter image description here

Я основал свой массив указателей на ответе Массивы указателей

Я успешно создаю массив, и если я вызываю какой-либо конкретный элемент в нем, он дает правильный результат. Однако, если я пытаюсь перебрать массив указателей, я получаю ошибку сегментации, когда она достигает значений, указывающих на второй объект.

Это странно, потому что, если я явно вызываю значение, хранящееся в массиве указателей из объекта 2 или 3 и т. Д., Оно выдает правильное значение. Сбой возможен только при попытке перебрать все значения.

вот код:

program pointers

type objects
    real, allocatable    :: array(:)
    character(10)        :: misc1=""
end type objects

type ptr
    real, pointer :: p
end type ptr

class(objects), allocatable, target  :: objectArray(:)
integer                              :: i, j, elem
type(ptr), allocatable               :: pointy(:)

allocate(objectArray(3))

do i = 1,3
    allocate(objectArray(i)%array(i+1))  ! arbitrary array length in each object,
enddo

allocate(pointy(9)) ! this is 2 + 3 + 4, dimeneions of each objectArray%array

elem = 0  ! dummy counter variable
do i = 1,3
    do j = 1,size(objectArray(i)%array)
        elem = elem + 1
        ! give dummy values to objectArray, then point to them with pointy
        objectArray(i)%array(j) = rand()
        pointy(elem)%p => objectArray(i)%array(j)
        print*,i,j, 'obj: ', objectArray(i)%array(j), 'pointer: ', pointy(elem)%p
    enddo
enddo

print*, 'size: ', size(pointy), elem, pointy(9)%p
print*, '========================='

do i = 1,size(pointy)
    print*, i, pointy(i)%p
enddo
end program pointers

и вот вывод: enter image description here

1 Ответ

0 голосов
/ 12 января 2019

Франческал дал ответ в комментариях. Но для закрытия:

Использование gcc/6.4.0 вместо gcc/5.4.0 решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...