Проверка размеров автоматических объектов в явных интерфейсах - PullRequest
0 голосов
/ 12 декабря 2018

Я всегда предполагал, что предоставление значений в фиктивных аргументах автоматического размера в определениях подпрограмм имеет некоторое преимущество в обнаружении ошибок, когда подпрограмма определена внутри модуля, который дает явный интерфейс.Но следующий пример показывает, что на самом деле не выполняется проверка границ массива:

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(:).В чем преимущество такого измерения?

...