什么是假定的长度字符函数结果,为什么要避免它?

时间:2017-03-14 16:12:54

标签: fortran

在回答问题about character function results of non-constant length时,答案提及"假设长度函数结果"但是没有详细说明。

如果我想返回长度取决于其他内容的字符结果,那么该答案会提到自动对象和延迟长度作为可能的方法:

function deferred_length(x)
  character(*), intent(in)  :: x
  character(:), allocatable :: deferred_length
  deferred_length = x//'!'
end function

function automatic(x)
  character(*), intent(in)  :: x
  character(LEN(x)+1)       :: automatic
  automatic = x//'!'
end function

假设的长度函数结果是什么?它与上述形式有何不同?此外,为什么这样的提及降级为脚注?

1 个答案:

答案 0 :(得分:2)

假设长度字符函数如下所示:

function assumed_len(x)
  character(*), intent(in)  :: x
  character(*)              :: assumed_len
  assumed_len = x//'!'
end function

这里伪参数x和函数结果assumed_len都是假定的长度字符。

在引用函数时,x如何假定实际参数的长度,函数结果假定其长度来自引用位置中的函数声明

使用上述功能,考虑程序

implicit none
character(len=11) :: x='Hello world'
character(len=12) assumed_len

print *, assumed_len(x)

end

在函数执行期间,函数结果的长度为12,如主程序中所声明的那样。同样,如果我们希望它的长度为5,我们只需将主程序中的声明更改为character(len=5) assumed_len即可。在不同的程序单元中,声明可能是不同的,并且函数结果在引用时将假定该长度。

嗯,这看起来并不那么有害:我们为什么要避免使用这样的功能呢?

  • 他们反对"哲学"现代Fortran;
  • 现代Fortran有更好的方法来完成同样的事情;
  • 他们非常有限。

在Fortran的其他方面,函数结果的属性仅取决于函数的参数和其他可访问的信息。这里函数结果的属性可以通过声明与其他所有属性相同。

其他要点:

  • 这样一个函数的接口必须隐含在引用的地方(我们不喜欢隐式接口);
  • 即使输入不同,我们也无法在同一个地方两次引用相同的功能并得到不同的长度结果;
  • 该函数可以更好地了解它想要返回的长度。

在我们确实想要控制引用位置长度的情况下,我们可以用{/ p>这样的函数替换assumed_len

function replacement(x, n)
  character(*), intent(in) :: x
  integer, intent(in)      :: n
  character(n)             :: replacement
  ...
end function

或子程序

subroutine replacement(x, y)
  character(*), intent(in)  :: x
  character(*), intent(out) :: y
  ...
end subroutine

最后,假定的长度字符函数在当前的Fortran标准中被声明为过时,并且可能会在以后的版本中删除。