[英]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
在被引用時必須有一個可用的顯式接口; 第一個只需要一個隱式接口(無論如何你都會給它,對嗎?) 至於為什么除此之外幾乎沒有什么區別:虛擬參數是intent(in)
(而不是指針)。 這意味着你不能改變它的值,你不能(在第二種情況下)改變分配狀態。 簡單地說,如果您不能更改任何屬性(除了傳遞給其他intent(in)
可分配/指針假人的情況),則沒有理由使用延遲長度。 幾乎所有對虛擬參數的引用/使用都可以通過任何一種形式完成。
盡可能堅持使用假定長度。
最后,字符長度並不是一個需要考慮的非常特殊的方面,因此相關問題的許多要點都適用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.