【问题标题】:Why is this not causing an overflow error?为什么这不会导致溢出错误?
【发布时间】:2014-05-22 03:41:17
【问题描述】:

这是一个简单的程序。我预计 j>4 时会出错,但 Fortan 却显示 array(2,5)=0.0。如果它给我一个堆栈溢出错误会更有用。

你有什么意见?

program main 

implicit none

integer,parameter :: n=2,z=4
!real, dimension(1:2,1:4) :: array
real,allocatable ::  array(:,:)
integer :: i,j

allocate(array(n,z))
array = 0.0
array(1,1)=1.0 ; array(1,2)=2.0 ; array(1,3)=3.0 ; array(1,4)=4.0
array(2,1)=5.0 ; array(2,2)=6.0 ; array(2,3)=7.0 ; array(2,4)=8.0

do j=1,5
    do i=1,2
        write(*,*) i,j
    write(*,*) array(i,j)
    enddo
enddo

end program main

【问题讨论】:

  • 仅仅因为你没有在内存中分配一个特定的空间并不意味着如果你尝试使用它就会崩溃。根据情况,它可能会或可能不会引起问题。这称为未定义行为。

标签: arrays segmentation-fault fortran


【解决方案1】:

您正在做的事情超出了数组的范围。这不一定会越过堆栈的边界,而且对于这个小数组不太可能这样做。 Fortran 编译器生成的可执行文件通常不检查非法下标错误。原因是这样的检查会减慢程序的速度。您可以使用编译时选项请求此类检查。例如,在 gfortran 中使用 -fcheck=all-fcheck=bounds。使用 ifort,-check all-check bounds。 “all”选项包括“bounds”选项和附加检查。

【讨论】:

  • 或者甚至只是-check with ifort
【解决方案2】:

使用 g95 -fbounds-check 编译并运行给出

在文件 xoverflow.f90 的第 18 行(第 6 单元) Traceback:不可用,使用 -ftrace=frame 或 -ftrace=full 编译 Fortran 运行时错误:数组元素越界:5 in (1:4),dim=2

和 gfortran -fbounds-check 给出了类似的结果。所以你应该使用这些免费的编译器和至少选项 -fbounds-check 和 -Wall 来测试你的代码。

【讨论】:

    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2011-12-07
    • 2011-02-08
    • 2023-04-10
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多