让我们假设一个函数适用于任意长度的字符串str
:
我想到了两种不同的选择,但我不确定它们是否完全相同,也不确定哪一种是更好的做法。
方式1
function func_name(str) result(ouput)
character(len=*), intent(in) :: str
...
end function func_name
方式2
function func_name(str) result(ouput)
character(len=:),allocatable, intent(in) :: str
...
end function func_name
最佳答案
这两种方法并不相同:一种具有假定长度的虚拟参数,另一种具有延迟长度。这些意味着完全不同的事情。
也就是说,在这种情况下存在三个主要区别:
- 第二个
func_name
的实际参数必须是可分配/延迟长度 - 第二个
func_name
在被引用时必须有一个可用的显式接口(interface);第一个只需要一个隐式接口(interface)(无论如何你都会提供它,对吧?) - 只有在第二种形式中,虚拟参数才能传递给可分配的虚拟变量
至于为什么除此之外没有什么区别:虚拟参数是 intent(in)
(而不是指针)。这意味着您无法更改其值,也无法(在第二次中)更改分配状态。简而言之,如果您无法更改任何属性,则没有理由使用延迟长度(除非传递给其他 intent(in)
可分配/指针虚拟对象)。几乎任何对虚拟参数的引用/使用都可以使用任何一种形式来完成。
尽可能坚持使用假定长度。
最后,字符长度并不是一个需要考虑的非常特殊的方面,a related question 中的很多要点都需要考虑。申请。
关于用于任意长度字符串的 Fortran 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70093994/