2

string 内の最後の非空白文字の位置を特定するための移植可能な関数/サブルーチンが必要です。LEN_TRIMとの 2 つのオプションが見つかりまし LNBLNKた。ただし、コンパイラごとに標準が異なるようです。次のコンパイラの公式ドキュメントは、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

g77(と でテスト済みgfortran。オプションを使用して-ffree-form、このような自由形式のソースをコンパイルします)。

于 2009-08-11T09:58:10.720 に答える
2

これがFortran 95より前のものかどうかを調べようとして立ち往生していますが、そうです

len(trim(s))

仕事?

于 2009-08-10T22:40:15.357 に答える
2

標準の前に、私はノーと言うでしょう。F77 コードで手動で実装された len_trim 関数を見てきました。古いコンパイラに対して標準になりたい場合は、フェイルセーフとして独自の実装を提供し、プリプロセッサ条件を使用して必要なものを選択する必要があります。

于 2009-08-10T20:38:59.920 に答える