用于任意长度字符串的 Fortran 函数

标签 fortran

让我们假设一个函数适用于任意长度的字符串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/

相关文章:

ubuntu - gfortran LAPACK "undefined reference"错误

fortran - Fortran 2003 中的常量函数指针数组

Fortran:使用两种不同编译器编译的生成代码之间的差异

matlab - Fortran 与 Matlab 的精度

multidimensional-array - 在Fortran 90中使用2d数组与派生类型的数组

Python glmnet "No module named _glmnet"

python - 我可以在带有子例程调用的子例程上使用 F2PY 吗?

c++ - 混合 C++ 和 Fortran 代码的问题

linux - Fortran 中子目录的标准输入重定向

performance - 不同优化下的 Fortran 矩阵乘法性能