代码之家  ›  专栏  ›  技术社区  ›  Pete

Fortran中的字符串:便携式len_trim和lnblnk?

  •  2
  • Pete  · 技术社区  · 16 年前

    我需要一个可移植的函数/子例程来定位字符串中最后一个非空字符的位置。 . 我找到了两个选择: LEN_TRIM LNBLNK . 然而,不同的编译器似乎有不同的标准。以下编译器的官方文档表明,len_trim是以下平台上Fortran 95标准的一部分:

    但是,在F95标准之前发布的编译器上似乎没有任何保证。 我的经验是,旧的编译器可能会指定 莱纳特里姆 LNBLNK 但不一定两者都有。我的解决方案是使用预处理器条件:

    #ifdef USE_LEN_TRIM
            iNameLen = LEN_TRIM(cabase)
            iExtLen = LEN_TRIM(caext)
    #else
            iNameLen = LNBLNK(cabase)
            iExtLen = LNBLNK(caext)
    #endif
    

    然后通过 -DUSE_LEN_TRIM 到预处理器。但是,我不太喜欢预处理器条件和额外的编译时标志。 对于定位字符串中最后一个非空字符位置的可移植(在Fortran 95标准之前)函数,您有什么建议吗?

    3 回复  |  直到 16 年前
        1
  •  3
  •   F'x    16 年前

    Len_Trim是Fortran 95标准的一部分。我不知道Fortran 77中任何简单的内部函数组合都可以解决这个问题(trim也出现在Fortran 95中,在Fortran 77中不可用)。但是,如果您真的想在不依赖编译器内部函数和预处理器的情况下实现可移植性,则可以使用简单的用户函数来执行该任务:

      function lentrim(s)
        implicit none
        character(len=*) :: s
        integer lentrim
    
        do lentrim = len(s), 1, -1
          if (s(lentrim:lentrim) .ne. ' ') return
        end do
      end function lentrim
    

    (测试) g77 gfortran 使用选项 -ffree-form 像这样编译自由格式的源代码)。

        2
  •  2
  •   Stefano Borini    16 年前

    在标准之前,我会说不,我已经看到了手工在F77代码上实现的len_trim功能。如果您希望成为旧编译器的标准,那么您必须提供自己的实现作为故障保护,并使用一个有条件的预处理器来选择您需要的。

        3
  •  2
  •   Tim Whitcomb    16 年前

    我一直在努力寻找这是否是一个前Fortran 95,但确实

    len(trim(s))
    

    工作?

    推荐文章