【发布时间】:2018-06-03 11:20:08
【问题描述】:
我正在尝试决定这两个选项中的哪一个是最好的:
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 的调用是否符合指示的大小。但是,我不知道编译器是否可以在给定参数可分配时执行这些检查,例如(如果这种分配取决于在运行时确定的其他事情,则更是如此)。第二个需要显式接口并且有更多代码(检查),但似乎会捕获更多错误。
使用每种方法的优点/缺点是什么?在哪些情况下应该使用一种而不是另一种?
【问题讨论】:
-
可能以前处理过,可能从不同的角度来看。 It.可能会带来速度与假设形状的差异,在适当的情况下建议使用
contiguous。 -
要求“首选方式”可能会导致人们选择基于意见关闭。也许你可以改写清楚地询问具体方面? (请注意,显式形状和假定形状不仅仅是一点点不同。)
-
“我知道当你编译时出现警告,第一种情况应该在编译时自动检查对 sqtrace 的调用是否符合指示的大小。” 也许,如果你使用使用正确的编译器可能会发生这种情况。通常不会进行检查。无论如何,调用站点的大小在编译时可能是未知的。显式大小参数来自过去,大多数时间都没有对参数进行检查。
-
@francescalus 不,这确实是一个广泛的问题。问题是我发现自己不断地在没有明确信念的情况下将我的编程从一种方式切换到另一种方式。而且我觉得我缺乏某种知识来帮助我制定如何使用它的标准,但不清楚这些知识到底是什么。
-
我认为需要一个真正令人信服的理由来强制调用例程传递一个多余的大小参数。我什么都看不到。
标签: fortran allocation subroutine error-checking