Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran过程中作为参数传递大小与假定形状_Fortran_Allocation_Subroutine_Error Checking - Fatal编程技术网

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

在Fortran过程中作为参数传递大小与假定形状,fortran,allocation,subroutine,error-checking,Fortran,Allocation,Subroutine,Error Checking,我正试图决定这两个选项中哪一个是最好的: 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( Msize, Matrix, Value )
  integer, intent(in)  :: Msize
  real*8,  intent(in)  :: Matrix(Msize, Msize)
  real*8,  intent(out) :: Value

  [instructions...]

end subroutine sqtrace
VS

我理解,当您使用警告进行编译时,第一种情况应该在编译时自动检查对
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+”


形状:

  • 显式形状数组的形状遵循其声明
  • 假定形状数组伪参数的形状与实际参数的形状相同
  • 延迟形状伪参数的形状可能未定义、在过程中定义或实际参数的形状
连续性:

  • 显式形状数组是简单连续的
  • 假定形状数组伪参数的邻接性与关联的实际参数的邻接性相关
  • 延迟形状伪参数可能是实际参数的参数,也可能取决于过程的执行
对实际论点的限制:

  • 与显式形状数组关联的实际参数的元素数必须至少与伪参数的元素数相同
  • 与假定形状数组关联的实际参数本身不能为假定大小
  • 与假定或延迟形状数组关联的实际参数必须与伪参数具有相同的秩
调用范围中的接口:

  • 如果伪参数为假定或延迟形状,则引用范围必须具有可访问的过程的显式接口

考虑一下真正的a(6)。这可能是傻瓜们的一个实际论点

real b(3)
real c(2,3)
real d(:)   ! With an explicit interface available
a(1::2)
可能与
b
相关联,但由于
b
是连续的,因此将涉及到复制入/复制出。当与
d
关联时,不需要涉及复制入/复制出,但可能会涉及


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

首先,一些术语。考虑声明为

的哑参数
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+”


形状:

  • 显式形状数组的形状遵循其声明
  • 假定形状数组伪参数的形状与实际参数的形状相同
  • 延迟形状伪参数的形状可能未定义、在过程中定义或实际参数的形状
连续性:

  • 显式形状数组是简单连续的
  • 假定形状数组伪参数的邻接性与关联的实际参数的邻接性相关
  • 延迟形状伪参数可能是实际参数的参数,也可能取决于过程的执行
对实际论点的限制:

  • 与显式形状数组关联的实际参数的元素数必须至少与伪参数的元素数相同
  • 与假定形状数组关联的实际参数本身不能为假定大小
  • 与假定或延迟形状数组关联的实际参数必须与伪参数具有相同的秩
调用范围中的接口:

  • 如果伪参数为假定或延迟形状,则引用范围必须具有可访问的过程的显式接口

考虑一下真正的a(6)。这可能是傻瓜们的一个实际论点

real b(3)
real c(2,3)
real d(:)   ! With an explicit interface available
a(1::2)
可能与
b
相关联,但由于
b
是连续的,因此将涉及到复制入/复制出。当与
d
关联时,不需要涉及复制入/复制出,但可能会涉及


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

可能以前处理过,可能是从不同的角度。它可能会在假定形状的情况下带来速度上的差异,建议在适当的情况下使用相邻的。询问“首选方式”可能会导致人们选择以基于意见的方式关闭。也许你可以重新措辞,清楚地询问具体方面的问题?(请注意,显式形状和假定形状不仅仅有一点不同。)“我理解,当您使用警告编译时,第一种情况应该在编译时自动检查对sqtrace的调用是否符合指定的大小。”也许,如果您使用模块,可能会在正确的编译器中发生。通常不会进行检查。无论如何,调用站点的大小在编译时可能是未知的。显式大小参数来自于过去,那时大多数时候没有对参数进行检查。@francescalus,不,这确实是一个广泛的问题。问题是,我发现自己不断地从一种方式切换到另一种方式,没有明确的合作伙伴