显式接口中自动对象的尺寸检查

时间:2018-12-12 14:07:19

标签: fortran fortran90 subroutine

我一直认为,当例程在提供显式接口的模块内定义时,在子例程定义内使用自动调整大小的伪参数提供值在错误检测方面会有所帮助。但是下面的示例表明,实际上并没有检查数组范围:

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

因此,第三个值将超出arr范围,在我的情况下,将打印-858993460。我了解在编译时通常无法捕获此类行为。但是,即使将ifort/check:bounds选项一起使用,在运行时也不会给出错误消息。

因此,我想问一下,用arr指定Dimension(n)是一种好习惯还是用Dimension(:)定义它是更好的选择。这样指定尺寸有什么好处?

0 个答案:

没有答案