未知长度的字符返回功能

MuK*_*KeP 3 string fortran function trim character

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

trim()我理解,该函数表明可以不指定返回字符串的长度.

例如:

write (*,*) trim(str)
Run Code Online (Sandbox Code Playgroud)

将仅返回字符串的一部分而没有尾随空格.

此函数对调用前返回字符串的长度一无所知.

trim()功能有局限性?

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

我找到了(在fortran中返回未知长度的字符串),但这不是我的问题的答案.

可以肯定的是,我想编写函数,它按整数返回字符串.

像这样的东西:

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

somewhere else:

write (*,*) strByInt(50) ! will write '50'
Run Code Online (Sandbox Code Playgroud)

Vla*_*r F 5

你引用的那个问题部分地回答了它.它提到了具有延迟长度的可分配字符.请参阅下面我定期使用的实施:

  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
Run Code Online (Sandbox Code Playgroud)

结果变量在最后一行的赋值时分配以适合答案.

trim函数是一个不同的野兽,作为一个内在函数,它不必在Fortran中编程,并且可以遵循不同的规则.它只返回它需要返回的东西.但它可以很容易地实现如上所述.


小智 5

Fortran2003 具有可变字符长度功能。这是一个示例代码。该程序输出“Beep!Beep!” 细绳。

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
Run Code Online (Sandbox Code Playgroud)

以下行声明可变长度字符变量。

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

在 Intel Fortran 中,您可能需要“/standard-semantics”或“Enable F2003 semantics”。

  • 为什么 ifort 中的许多 2003 功能默认关闭?是为了兼容性还是性能?似乎它会引起很多头痛(至少对我来说),您必须指定 -assume 或 -standard-semantics。 (2认同)
  • 对于可在 Intel Fortran 中分配的延迟长度,您不需要 /standard-semantics。如果您想要隐式重新分配,您确实需要它来分配给可分配的数组 - 这是出于性能原因而完成的。我们正在讨论在未来版本中将重新分配设为默认值。块来了。 (2认同)