String Fortran函数变长字符串返回

String Fortran函数变长字符串返回,string,function,fortran,String,Function,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

我正在编写一个返回字符串的函数

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

为此,您可以使用可分配字符串:

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

对于子例程和函数,这是相同的。只有标题不同,但可以将结果变量用作任何其他变量。我最喜欢的例子是将整数转换为字符串

  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语句,但这是多余的。

到目前为止您尝试了什么?我不能使用
字符(Len=*)::s
您尝试过可分配字符串吗?我将尝试告诉您发生了什么是的,可以返回可分配函数结果,甚至是延迟长度的字符。如果没有看到你的尝试,我无法判断你到底出了什么问题。我不同意你上一次的说法。以我的经验,按任务分配是自找麻烦!您应该总是在分配任务之前进行分配,并在编译时停用该特定功能。我不介意,这是标准配置,与F95的自动释放方式相同,甚至Intel也在考虑将其设为默认配置。当您不分配时,会遇到什么样的问题?@Zeus查看如果您意外分配了一个形状不匹配的数组,您将不会收到错误消息,但该数组将自动重新分配。这使得反窃听变得非常棘手。即使在另一个答案中讨论了
allocate
语句的优点,它也很好地提醒了我们如何分配延迟长度字符。