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