愛しの Fortran・3改

Fortran について気の向くままに綴ります

実数値を文字列に変換する関数 (その5)

結果変数の長さ決めとその利用

書式仕様 (*(G0,1X)) または (*(G0)) での出力とともに使う、実数配列値を文字配列値に変換する関数の実装を説明しています。

結果変数の長さを決める際、

      L = 0
      DO I = 1, N
        WRITE(LINE,FMT) A(I)
        L = MAX(LEN_TRIM(LINE),L)
      END DO

として、全要素をいったん書いてみて必要な長さを実測しています。 ユーザーが FMT に渡した書式仕様が欄幅固定なら長さを決めるのに 1 つだけ選んで実測することも考えられますが、欄幅に 0 を指定して値ごとに欄幅が変わる場合に対応しています。

その後、割り付けた結果変数を使う際には、実測した長さで割り付けているにもかかわらず、いったん十分な長さの変数に書いたのを結果変数に代入し直しています。

      DO I = 1, N
        WRITE(LINE,FMT) A(I)
        RESULT(I) = LINE
      END DO

これは末尾に空白のある書式仕様が指定された場合、それが長さを決める際の LEN_TRIM で反映されないことに対応するためです。

その他、現状では FMT での改行の指定「/」はできない、などの仕様上の問題点はあります。

今回の実装では結果を配列にしましたが、いっそ配列入力に対してスカラ文字列を返すようにした方が使い勝手はいいかもしれません。