型宣言付き 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 の決め方ですが、もうだいぶ書いたのでそれは次回とします。
(つづく)