実数値を文字列に変換する関数 (配列編)
前回までで、書式仕様の指定を簡略化する目的で、 実数値を文字列に変換する関数を実装しました。
かつては WRITE 文で呼び出された関数で WRITE 文を実行することは禁じられていました(再帰的 WRITE の禁止)。 Fortran 2003 で WRITE 文で呼び出された関数内での 「単純な」内部ファイルの WRITE は許可されたことも 前回の関数を実装できた背景にありました (と、前回説明するのを忘れた)。
今回はさらに配列引数への拡張です。
単に ELEMENTAL にすれば良さそうなものですが…。
文字配列の配列要素は全て長さが共通です。 だから組込み関数 TRIM は要素別処理関数ではありません。 前回のやりかたでは ELEMENTAL にはできないことがわかります (前々回の結果の長さを引数で与える方式ならできそう)。
今回は 1 次元配列の実装を別に用意することにします。 下がそのプログラムです。 どうしてこうなるのか。 各部で説明することが多いので、それは次回とします。
(つづく)
MODULE MODULE USE, INTRINSIC :: IEEE_ARITHMETIC INTEGER, PARAMETER :: & R_ = IEEE_SELECTED_REAL_KIND(13) INTEGER, PARAMETER :: L_ = 132 CONTAINS ! FUNCTION F_(A,FMT) RESULT(RESULT) REAL(R_), INTENT(IN) :: A(:) CHARACTER(*), INTENT(IN) :: FMT CHARACTER(:), ALLOCATABLE :: RESULT(:) INTEGER :: I, L, N CHARACTER(L_) :: LINE N = UBOUND(A,1) L = 0 DO I = 1, N WRITE(LINE,FMT) A(I) L = MAX(LEN_TRIM(LINE),L) END DO ALLOCATE(CHARACTER(L) :: RESULT(N)) DO I = 1, N WRITE(LINE,FMT) A(I) RESULT(I) = LINE END DO END FUNCTION F_ END MODULE MODULE PROGRAM PROGRAM USE :: MODULE WRITE(*,"(*(G0,1X))") & F_([ 12.3_R_, -9.87_R_, 0.0_R_ ],"(F0.2)") END PROGRAM PROGRAM