簡體   English   中英

Fortran function 用於任意長度的字符串

[英]Fortran function for a string of any length

讓我們假設一個適用於任意長度str的字符串的 function :

我想到了兩種不同的選擇,但我不確定它們是否完全相同,或者哪個是更好的做法。

方式一

function func_name(str) result(ouput)
        character(len=*), intent(in) :: str
        ...
     end function func_name

方式二

function func_name(str) result(ouput)
        character(len=:),allocatable, intent(in) :: str
        ...
     end function func_name

為什么不在代碼中嘗試呢?

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

因此,要使第二個 function 形式正確,實際參數必須具有延遲長度( Len =: ) 您通常需要第一種形式。

這兩種方法並不相同:一種具有假定長度的虛擬參數,另一種具有延遲長度。 這些意味着完全不同的東西。

也就是說,在這種情況下存在三個主要區別:

  • 第二個func_name的實際參數必須是可分配/延遲長度
  • 第二個func_name在被引用時必須有一個可用的顯式接口; 第一個只需要一個隱式接口(無論如何你都會給它,對嗎?)
  • 只有在第二種形式中,dummy 參數才能傳遞給可分配的 dummy

至於為什么除此之外幾乎沒有什么區別:虛擬參數是intent(in) (而不是指針)。 這意味着你不能改變它的值,你不能(在第二種情況下)改變分配狀態。 簡單地說,如果您不能更改任何屬性(除了傳遞給其他intent(in)可分配/指針假人的情況),則沒有理由使用延遲長度。 幾乎所有對虛擬參數的引用/使用都可以通過任何一種形式完成。

盡可能堅持使用假定長度。

最后,字符長度並不是一個需要考慮的非常特殊的方面,因此相關問題的許多要點都適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM