Я всегда предполагал, что предоставление значений в фиктивных аргументах автоматического размера в определениях подпрограмм имеет некоторое преимущество в обнаружении ошибок, когда подпрограмма определена внутри модуля, который дает явный интерфейс.Но следующий пример показывает, что на самом деле не выполняется проверка границ массива:
module test_mod
Implicit none
contains
!> Testing routine that has an automatic array arr of length n. The integer n is also given.
!> It is included in a module and has an explicit interface.
subroutine print_array(n, arr)
Integer, intent(in) :: n !< Size of arr
Integer, Dimension(n), intent(in) :: arr !< A test array that should be of size n
Integer :: i
do i = 1, n
print *, 'number:', i, arr(i)
enddo
End Subroutine print_array
end module test_mod
program playground
use test_mod, only : print_array
! Call print_array with an array smaller than 3 elements
Call print_array(3, [8, 9])
end program playground
arr
создается с размером n
в подпрограмме print_array
, но не проверяется, измеряется ли измерениеданного массива является правильным.В моем примере вывод:
number: 1 8
number: 2 9
number: 3 -858993460
Таким образом, 3-е значение берется за пределами arr
границ, и в моем случае выводится -858993460.Я понимаю, что такое поведение обычно не может быть поймано во время компиляции.Но даже использование ifort
с параметром /check:bounds
не выдает сообщение об ошибке во время выполнения.
Поэтому я хотел бы спросить, является ли хорошей практикой указание arr
с помощью Dimension(n)
илиеще лучше определить это с помощью Dimension(:)
.В чем преимущество такого измерения?