我一直认为,当例程在提供显式接口的模块内定义时,在子例程定义内使用自动调整大小的伪参数提供值在错误检测方面会有所帮助。但是下面的示例表明,实际上并没有检查数组范围:
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(:)
定义它是更好的选择。这样指定尺寸有什么好处?