【问题标题】:Character-returning function of unknown length未知长度的字符返回函数
【发布时间】:2014-03-17 16:43:55
【问题描述】:

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

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

例如:

write (*,*) trim(str)

将只返回字符串的一部分,没有尾随空格。

这个函数在调用之前不知道返回字符串的长度。

或者trim()函数有限制?

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

我找到了 (Returning character string of unknown length in fortran),但这不是我问题的答案。

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

类似这样的:

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

somewhere else:

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

【问题讨论】:

    标签: string function fortran character trim


    【解决方案1】:

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

      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 函数是一个不同的野兽,作为一个内在函数,它不必在 Fortran 中编程并且可以遵循不同的规则。它只是返回它需要返回的东西。但它可以很容易地像上面那样实现。

    【讨论】:

    • 我早先发现了这样的结构,但问题与我使用“Compaq Visual Fortran”有关。现在我认为它对于这种操作来说太旧了。在 ifort 上试用时,确实效果很好。
    【解决方案2】:

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

    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
    

    下面一行声明了变长字符变量。

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

    您可能需要在 Intel Fortran 中使用“/standard-semantics”或“启用 F2003 语义”。

    【讨论】:

    • 为什么ifort默认关闭了很多2003的功能?是为了兼容性还是性能?您必须指定 -assume 或 -standard-semantics 似乎会引起很多麻烦(至少对我而言)。
    • 我非常同意。我也希望英特尔尽快实施 BLOCK..END BLOCK。 BLOCK 结构增强了代码的局部性(我们甚至可以在 BLOCK 结构中使用 USE Module 功能。)没有这个 DO CONCURRENT 就不能完全工作。
    • 您不需要 /standard-semantics 来在 Intel Fortran 中分配延迟长度。如果您想要隐式重新分配,您确实需要它来分配可分配数组 - 这是出于性能原因。我们正在讨论在未来版本中将重新分配设为默认值。块来了。
    • 如果program String会使用一个变量来存储say2的结果,我是否只需要声明为character(:), allocatable :: doubledString然后赋值doubledString = say2('Beep! ')?我是否需要以某种方式解除分配,以防止内存泄漏等?
    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多