这是一个简单的程序。我预计在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
答案 0 :(得分:4)
您正在做的是超出数组的范围。这不一定会超过堆栈的边界,并且不太可能使用这个小数组。 Fortran编译器生成的可执行文件通常不检查非法下标错误。原因是这样的检查会减慢程序的速度。您可以使用编译时选项请求此类检查。例如,使用gfortran使用-fcheck=all
或-fcheck=bounds
。使用ifort,-check all
或-check bounds
。 “所有”选项包括“边界”选项和其他检查。
答案 1 :(得分:1)
使用g95 -fbounds-check进行编译并运行
文件xoverflow.f90第18行(第6单元) 回溯:不可用,使用-ftrace = frame或-ftrace = full进行编译 Fortran运行时错误:数组元素超出范围:5英寸(1:4),dim = 2
和gfortran -fbounds-check给出了类似的结果。因此,您应该使用这些免费编译器以及至少选项-fbounds-check和-Wall来测试您的代码。