Fortran问题:我成功制作了一个指针数组,该指针指向对象数组中的元素
编译器为gcc/5.4.0
使用gcc/6.4.0
解决了这个问题。
选项是:
>>gfortran -fdefault-real-8 -o H -fbacktrace -g -fcheck=all pointersToObjects.f90
>>./H
我的指针数组基于对Arrays of pointers的回答
我成功创建了数组,并且如果我在其中调用任何特定元素,它将给出正确的结果。但是,如果尝试遍历指针数组,则一旦达到指向第二个对象的值,就会遇到分段错误。
这很奇怪,因为如果我从对象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
答案 0 :(得分:2)
Francescalus在评论中给出了答案。但要闭幕:
使用gcc/6.4.0
而不是gcc/5.4.0
可以解决此问题。