2

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

但是,在 F95 标准之前发布的编译器似乎没有任何保证。 我的经验是,较旧的编译器可能会指定一个LEN_TRIMLNBLNK,但不一定同时指定两者。我的解决方案是使用预处理器条件:

#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 标准之前)函数有什么建议吗?

4

3 回答 3

3

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

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

于 2009-08-11T09:58:10.720 回答
2

在标准之前,我会说不。我见过在 F77 代码上手动实现的 len_trim 函数。如果您想对旧编译器保持标准,那么您将必须提供自己的实现作为故障保护,并使用预处理器条件来选择您需要的内容。

于 2009-08-10T20:38:59.920 回答
2

我一直试图找出这是否是 Fortran 95 之前的版本,但确实如此

len(trim(s))

工作?

于 2009-08-10T22:40:15.357 回答