Вопрос на Фортране: я успешно создал массив указателей, которые указывают на элементы в массиве объектов
Компилятор gcc/5.4.0
Примечание:
Использование gcc/6.4.0
эта проблема решена.
варианты:
>>gfortran -fdefault-real-8 -o H -fbacktrace -g -fcheck=all pointersToObjects.f90
>>./H
вот картинка моей проблемы
Я основал свой массив указателей на ответе Массивы указателей
Я успешно создаю массив, и если я вызываю какой-либо конкретный элемент в нем, он дает правильный результат. Однако, если я пытаюсь перебрать массив указателей, я получаю ошибку сегментации, когда она достигает значений, указывающих на второй объект.
Это странно, потому что, если я явно вызываю значение, хранящееся в массиве указателей из объекта 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
и вот вывод: