【问题标题】:Fortran: SIGSEGV after successfully creating array of pointersFortran:成功创建指针数组后的 SIGSEGV
【发布时间】: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.0gfortran -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 的存储关联规则,并且可能在指针算法方面存在一些有趣的问题。
  • 好吧,我只是想支持史蒂夫的说法,并说应该像瘟疫一样避免改变数据类型大小的标志,从长远来看,你只是在寻求痛苦的生活

标签: arrays pointers fortran


【解决方案1】:

Francescalus 在 cmets 中给出了答案。但是要关闭:

使用gcc/6.4.0 而不是gcc/5.4.0 可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多