String 未知长度的字符返回函数

String 未知长度的字符返回函数,string,function,fortran,character,trim,String,Function,Fortran,Character,Trim,如何使用初始结果长度未知的字符函数 据我所知,trim()函数表明可以不指定返回字符串的长度 例如: write (*,*) trim(str) 将只返回字符串的一部分,不带尾随空格 此函数不知道调用前返回字符串的长度 或者trim()函数有限制 更多变体是查找trim()函数的原始代码 我找到了()但这不是我问题的答案 当然,我想写一个函数,它按整数返回字符串 大概是这样的: function strByInt(myInt) ... write (strByInt,fmt) myInt; r

如何使用初始结果长度未知的字符函数

据我所知,
trim()
函数表明可以不指定返回字符串的长度

例如:

write (*,*) trim(str)
将只返回字符串的一部分,不带尾随空格

此函数不知道调用前返回字符串的长度

或者
trim()
函数有限制

更多变体是查找
trim()
函数的原始代码

我找到了()但这不是我问题的答案

当然,我想写一个函数,它按整数返回字符串

大概是这样的:

function strByInt(myInt)
...
write (strByInt,fmt) myInt; return
end function strByInt

somewhere else:

write (*,*) strByInt(50) ! will write '50'

你提到的那个问题部分地回答了这个问题。它提到具有延迟长度的可分配字符。请参见下面我经常使用的实现:

  function strByInt(i) result(res)
    character(:),allocatable :: res
    integer,intent(in) :: i
    character(range(i)+2) :: tmp
    write(tmp,'(i0)') i
    res = trim(tmp)
  end function
结果变量在最后一行赋值时分配,以适合答案


trim
函数是一个不同的beast,作为一个固有函数,它不必用Fortran编程,可以遵循不同的规则。它只返回它需要返回的内容。但是它也可以很容易地实现上述功能。

Fortran2003具有可变字符长度的特性。下面是一个示例代码。 此程序输出“嘟嘟!嘟嘟!”字符串

下一行声明可变长度字符变量

字符(len=:),可分配::say2


您可能需要“英特尔Fortran”中的“/标准语义”或“启用F2003语义”。

为什么在iFortran中默认关闭了许多2003功能?它是为了兼容性还是性能?它似乎引起了很多麻烦(至少对我来说),你必须指定-假设或-标准语义。我完全同意。我也希望英特尔能尽快实现BLOCK..END BLOCK。块构造增强了代码的局部性(我们甚至可以在块构造中使用“使用模块”功能)。没有这一点,DO CONCURRENT无法完全工作。对于可在英特尔Fortran中分配的延迟长度,您不需要/标准语义。如果您想要隐式重新分配,那么在分配到可分配数组时确实需要它——这是出于性能原因。我们正在讨论在将来的版本中默认重新分配。块即将到来。如果
程序字符串
将使用变量存储
say2
的结果,我是否只需要将其声明为
字符(:),可分配::doubledString
,然后分配
doubledString=say2('Beep!')
?我是否需要以某种方式解除分配,以防止内存泄漏或类似情况?我在早期发现了此类构造,但问题与我使用“Compaq Visual Fortran”有关。现在我认为它太老了,不适合这样的操作。在ifort上试用时,效果非常好。
module m_test
  implicit none
contains
  function say2(text)
    character(len = *), intent(in) :: text
    character(len = :), allocatable :: say2
    say2 = trim(text) // trim(text)
    return
  end function say2
end module m_test

program String
  use m_test
  implicit none
  print *, say2('Beep!   ')
  stop
end program String