传递大小作为参数VS在Fortran过程中假定形状

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传递大小作为参数VS在Fortran过程中假定形状相关的知识,希望对你有一定的参考价值。

我想确定这两个选项中哪一个最好:

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的调用符合指定的大小,第一种情况应该在编译时自动检查。但是,我不知道编译器是否可以在给定参数可分配时执行这些检查(例如,如果此类分配依赖于在运行时确定的其他事物,则更多如此)。第二个需要一个显式接口,并有更多的代码(检查),但似乎会捕获更多的错误。

使用每种情况的优点/缺点是什么?在哪种情况下,哪一种情况应该与另一种情况一起使用?

答案

首先,一些术语。考虑声明为的伪参数

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

(延迟形状数组也可以是指针而不是可分配的)。

在特定情况下,我不会回答哪个更好,但是会简单地详细说明一些重要的特征,如果有的话,给程序员留下选择。粗略地,许多人将显式形状阵列视为“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相关联时不需要涉及复制/复制,但可能是。

还有很多其他方面,但希望这是一个初步的高级别介绍。

以上是关于传递大小作为参数VS在Fortran过程中假定形状的主要内容,如果未能解决你的问题,请参考以下文章

访问在其程序中传递给 Fortran 可执行文件的文件名

类型绑定过程给出关于非多态传递对象虚拟参数的错误

从动态库加载Fortran函数:Debug vs Release

在 C++ 和 Fortran 代码之间传递复数数组

长度参数化的传递对象到类型绑定过程有 gfortran 抱怨

在 C++ 中将不同大小的常量数组作为函数参数传递