我有一段相当简单的代码(从大型程序中删除了必需品)。
我将一个数组和数组的大小传递给子程序。如果传递的大小与数组的实际大小不匹配,则不会出现错误。我甚至可以操纵不存在的阵列部分! (我覆盖了我不应该覆盖的内存。)
这是子程序:
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”进行编译,它只捕获主程序中的错误,但不会捕获子程序中的错误。
有没有办法捕捉子程序中的错误?
答案 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