2015-05-07 95 views
1

我寫一個函數返回一個字符串Fortran函數可變長度字符串返回

function doc() Result s 
character (Len=65) :: s 
... 
end function 

是否有可能有一個可變長度的字符串,在那裏我可以 分配返回的字符串的長度。我知道我可以用子程序來做,但不能用於功能。

Function discl (nm) Result (s) 

Character (Len=:), Allocatable :: s 
Character (Len=*), Intent (In) :: nm 

Integer :: n 
Character (Len=65) :: stamp 
stamp = "Thu May 7 15:13:48 BST 2015" 

n = Len_trim (stamp) 
Allocate (Character (n) :: s) 
s = Trim (fstamp) 

End Subroutine discl 
+1

到目前爲止,你*嘗試了什麼? –

+0

我不能使用'Character(Len = *):: s' – Zeus

+0

你試過可分配的字符串嗎? –

回答

5

它是一個子程序和功能相同。只有標題不同,但可以將結果變量用作其他變量。我最喜歡的例子是整數轉換爲字符串

function itoa(i) result(res) 
    character(:),allocatable :: res 
    integer,intent(in) :: i 
    character(range(i)+2) :: tmp 
    write(tmp,'(i0)') i 
    res = trim(tmp) 
    end function 

結果變量是在賦值時分配的。您可以在作業前使用allocate statement,但這是多餘的。

+0

我不同意你最後的陳述。根據我的經驗,按任務分配就是在尋求麻煩!您應該*總是*在分配之前分配並在編譯時停用該特定功能。 –

+3

我不用擔心,它的標準符合與從F95自動重新分配相同的方式,甚至Intel正在考慮將其設置爲默認值。 –

+0

當你不分配時遇到了什麼樣的問題? – Zeus

2

您可以使用分配的字符串用於此目的:

module str_mod 
    implicit none 

contains 

function str2str(str) result(s) 
    implicit none 
    character(len=*),intent(in) :: str 
    character(len=:),allocatable :: s 

    allocate(character(len=2*len(str)) :: s) 
    s = str // str 
end function 

end module 

program test 
    use str_mod 
    print *,str2str('test') 
end program 
+1

即使在另一個回答中討論了「allocate」語句的優點,這也是一個很好的提示,用於分配延遲長度字符。 – francescalus