在回答问题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
假设的长度函数结果是什么?它与上述形式有何不同?此外,为什么这样的提及降级为脚注?
答案 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的其他方面,函数结果的属性仅取决于函数的参数和其他可访问的信息。这里函数结果的属性可以通过声明与其他所有属性相同。
其他要点:
在我们确实想要控制引用位置长度的情况下,我们可以用{/ 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标准中被声明为过时,并且可能会在以后的版本中删除。