【问题标题】:Fortran function for a string of any length用于任意长度字符串的 Fortran 函数
【发布时间】:2021-11-24 09:55:35
【问题描述】:

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

【问题讨论】:

    标签: fortran


    【解决方案1】:

    这两种方法不一样:一种具有假定长度的虚拟参数,另一种具有延迟长度。这些意味着完全不同的东西。

    也就是说,在这种情况下存在三个主要区别:

    • 第二个func_name 的实际参数必须是可分配/延迟长度
    • 第二个func_name 在被引用时必须有一个可用的显式接口;第一个只需要一个隐式接口(无论如何你都会给它,对吧?)
    • 只有在第二种形式中,dummy 参数才能传递给可分配的 dummy

    至于为什么除此之外几乎没有区别:虚拟参数是intent(in)(而不是指针)。这意味着你不能改变它的值,你不能(在第二种情况下)改变分配状态。简单地说,如果您不能更改任何属性(传递给其他 intent(in) 可分配/指针假人的情况除外),则没有理由使用延迟长度。几乎所有对虚拟参数的引用/使用都可以通过任何一种形式完成。

    尽可能坚持使用假定长度。

    最后,字符长度并不是一个特别需要考虑的方面,所以a related question 的许多观点都适用。

    【讨论】:

      【解决方案2】:

      为什么不在代码中试试呢?

      ijb@ijb-Latitude-5410:~/work/stack$ cat char.f90
      Program test
      
        Implicit None
      
        Character( Len = 3 )              :: str1
        Character( Len = : ), Allocatable :: str2
      
        Allocate( Character( Len = 4 ) :: str2 )
      
        Write( *, * ) func_name_1( str1 )
        Write( *, * ) func_name_2( str1 )
        Write( *, * ) func_name_1( str2 )
        Write( *, * ) func_name_2( str2 )
        
      
      Contains
        
        Function func_name_1( str ) Result( output )
          Implicit None
          Integer :: output
          Character( Len = * ), Intent( In ) :: str
          output = Len( str )
        End Function func_name_1
      
        Function func_name_2 (str ) Result( output )
          Implicit None
          Integer :: output
          Character( Len = : ), Allocatable, Intent( In ) :: str
          output = Len( str )
        End Function func_name_2
      
      End Program test
      ijb@ijb-Latitude-5410:~/work/stack$ gfortran-11 --version
      GNU Fortran (GCC) 11.1.0
      Copyright © 2021 Free Software Foundation, Inc.
      This is free software; see the source for copying conditions.  There is NO
      warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      
      ijb@ijb-Latitude-5410:~/work/stack$ gfortran-11 -std=f2008 -Wall -Wextra -fcheck=all -g -O char.f90
      char.f90:11:29:
      
         11 |   Write( *, * ) func_name_2( str1 )
            |                             1
      Error: Actual argument at (1) to allocatable or pointer dummy argument ‘str’ must have a deferred length type parameter if and only if the dummy has one
      

      因此,要使第二个函数形式正确,实际参数必须具有延迟长度,( Len = : )。您通常需要第一种形式。

      【讨论】:

      • 第二种形式对实参的要求稍微强一些:必须是deferred length和allocatable(不能是deferred length和pointer)。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多