【发布时间】:2019-02-09 21:23:21
【问题描述】:
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
【问题讨论】:
-
您使用的是哪个编译器(包括版本),以及使用哪些选项进行编译?
-
我刚刚更新了问题以包含这些
gcc/5.4.0和gfortran -fdefault-real-8 -o H -fbacktrace -g -fcheck=all pointersToObjects.f90但我得到与gfortran -fdefault-real-8 -o H pointersToObjects.f90相同的结果 -
你可以试试更高版本的 gcc 吗?我用6没有问题。此外,您也许可以尝试使用
type(objects)而不是class(objects),因为看起来您不需要它是多态的。 -
@CharlieCrown,你为什么使用 -fdefault-real-8 选项?此选项用于移植代码而不是编写有效 Fortran 的快捷方式。它打破了 Fortran 的存储关联规则,并且可能在指针算法方面存在一些有趣的问题。
-
好吧,我只是想支持史蒂夫的说法,并说应该像瘟疫一样避免改变数据类型大小的标志,从长远来看,你只是在寻求痛苦的生活