愛しの Fortran・3改

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

型宣言付き ALLOCATE 文、UBOUND と SIZE

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

前回、書式仕様 (*(G0,1X)) または (*(G0)) での出力とともに使う目的で、実数配列値を文字配列値に変換する関数を示しました。今回はその内容の解説です。

まず、実数型配列の入力値に対して、文字型の配列値を返すので、その長さを決める必要がありました。入力配列の大きさを N、出力文字列の長さを L としたなら、出力配列の割り付けは

      ALLOCATE(CHARACTER(L) :: RESULT(N))

です(Fortran 2003 で導入された、型指定付きの ALLOCATE 文)。 世の中の Fortran 解説の多くは Fortran 95 で更新が止まっているものが多いので特に強調しました。

N はいつも通り、入力配列を A として

      N = UBOUND(A,1)

です。ちなみに、この場合は同じ結果になる

      N = SIZE(A)

を使わないのには理由があります。 A が 2 次元以上の配列で、2 つ目の引数 (DIM) を省略した場合に違いが出ます。 DIM のない UBOUND の結果は配列で、N = UBOUND(A)コンパイル時に見つかるエラーになります。 一方で DIM のない SIZE の結果は配列全体の大きさです。 添字の上限として使うつもりの N に入れるべき数値は次元の寸法であって、配列全体の大きさではないので、SIZE を使うのは不適切です。 この場合はコンパイル時には発見されず、実行時に結果が変になる、「バグ」となってしまって厄介です。 ただ、1 次元配列の場合はたまたま寸法と大きさが一致するので、SIZE を使ってしまう人もいます。 最初からすべて UBOUND に統一する方が無難です。

次に L の決め方ですが、もうだいぶ書いたのでそれは次回とします。

(つづく)