我正在试图决定这两个选项中哪一个最好:
subroutine sqtrace( Msize, Matrix, Value )
integer, intent(in) :: Msize
real*8, intent(in) :: Matrix(Msize, Msize)
real*8, intent(out) :: Value
[instructions...]
end subroutine sqtrace
VS
subroutine sqtrace( Matrix, Value )
real*8, intent(in) :: Matrix(:,:)
real*8, intent(out) :: Value
if ( size(Matrix,1) /= size(Matrix,2) ) then
[error case instructions]
end if
[instructions...]
end subroutine sqtrace
据我所知,当您使用警告进行编译时,如果对sqtrace
的调用符合指示的大小,则第一种情况应在编译时自动检查。但是,我不知道编译器是否可以在给定参数可分配时执行这些检查(例如,如果此类分配依赖于在运行时确定的其他事物,则更多如此)。第二个需要一个显式接口,并且有更多代码(检查),但似乎会捕获更多错误。
使用每种情况的优点/缺点是什么?在哪种情况下,哪一种情况应该与另一种情况相比?
答案 0 :(得分:7)
首先,一些术语。考虑声明为
的伪参数real :: a(n) ! An explicit shape array
real :: b(:) ! An assumed shape array
real, allocatable :: c(:) ! A deferred shape array
real :: d(*) ! An assumed size array
(延迟形状数组也可以是指针而不是可分配的)。
我不会回答在特定情况下哪个更好,但是会简单地详述一些重要的characeristics离开选择,哪里有一个,给程序员。粗略地说,许多人将显式形状阵列视为" Fortran 77"假设形状数组为" Fortran 90 +"。
形状:
Contiguousness:
对实际参数的限制:
调用范围中的接口:
考虑real a(6)
。这可能是假人的实际论据
real b(3)
real c(2,3)
real d(:) ! With an explicit interface available
a(1::2)
可能与b
相关联,但b
会导致连续的拷入/拷贝。与d
相关联时,不需要复制/复制,但可能是。{/ p>
还有很多其他方面,但希望这是最初的高级别介绍。