У меня есть довольно простой фрагмент кода (урезанный до сути из более крупной программы).
Я передаю массив и размер массива подпрограмме. Я не получаю ошибки, если переданный размер не соответствует фактическому размеру массива. И я даже могу манипулировать несуществующими частями массива!!! (Я перезаписываю память, которую не должен перезаписывать).
Вот подпрограмма:
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, он поймает ошибку только в основной программе, но не в подпрограмме.
Есть ли способ поймать ошибку в подпрограмме?
FORTRAN
. В любом случае, я согласен с тем, что более современные компиляторы должны иметь возможность проверить это, и здесь Intel не выдает предупреждения. - person John Alexiou   schedule 06.01.2014