FORTRAN:超出范围检查子程序失败?

时间:2014-01-06 19:11:00

标签: arrays fortran subroutine intel-fortran

我有一段相当简单的代码(从大型程序中删除了必需品)。

我将一个数组和数组的大小传递给子程序。如果传递的大小与数组的实际大小不匹配,则不会出现错误。我甚至可以操纵不存在的阵列部分! (我覆盖了我不应该覆盖的内存。)

这是子程序:

subroutine sub(arr, narr)
implicit none
integer, intent(in) :: narr
double precision, dimension(narr) :: arr
integer :: j

do j = 1, narr
  ! print all the values
  write(*, '("Arr[",I0,"] = ",f0.10)') j, arr(j)
  ! change the values
  arr(j) = -10d0
enddo

end subroutine

这里是主程序

program main

implicit none

integer, parameter :: narr = 5
! the array is made smaller
double precision, dimension(narr - 2) :: array

integer :: j

! assign values to array
array = (/ (1d0*j,   j = 1,narr - 2) /)

! print using the subroutine
print*, "inside subroutine" 
call sub(array, narr)

! print outside the subroutine
print *, " "
print *, "outside subroutine"
do j = 1, narr
  write(*, '("Arr[",I0,"] = ",f0.10)') j, array(j)
enddo

end program

如果我使用ifort和“-check all”进行编译,它只捕获主程序中的错误,但不会捕获子程序中的错误。

有没有办法捕捉子程序中的错误?

1 个答案:

答案 0 :(得分:1)

是。在子例程 - 假定形状数组中将数组声明为dimension(:)。使用此Fortran> 90声明要求调用者知道过程接口 - 最简单的方法是在模块中使用该过程并在调用者中使用use该模块。您实际上不需要将数组的大小传递给子例程 - 您可以将其确定为size(arr)。我已经离开了论据narr以保留错误。

module MySub

contains

subroutine sub(arr, narr)
implicit none
integer, intent(in) :: narr
double precision, dimension(:) :: arr
integer :: j

do j = 1, narr
  ! print all the values
  write(*, '("Arr[",I0,"] = ",f0.10)') j, arr(j)
  ! change the values
  arr(j) = -10d0
enddo

end subroutine

end module MySub


program main

use MySub

implicit none

integer, parameter :: narr = 5
! the array is made smaller
double precision, dimension(narr - 2) :: array

integer :: j

! assign values to array
array = (/ (1d0*j,   j = 1,narr - 2) /)

! print using the subroutine
print*, "inside subroutine"
call sub(array,narr)

! print outside the subroutine
print *, " "
print *, "outside subroutine"
do j = 1, narr
  write(*, '("Arr[",I0,"] = ",f0.10)') j, array(j)
enddo

end program