【Fortran学習|初心者向け】Fortranの配列操作を安全に!LBOUND / UBOUND関数の使い方

1. 導入:なぜ配列の境界を知る必要があるのか?

数値計算において、配列のサイズを正しく把握することは非常に重要です。特にFortranでは、配列のインデックスを「0から開始」したり、「10から開始」したりと自由に設定できます。もし、配列の範囲外にアクセスしてしまうと、プログラムは停止したり、誤った計算結果を出力したりします。LBOUND関数とUBOUND関数は、配列の開始と終了のインデックスを自動的に取得することで、こうした「境界超過(Out of bounds)」エラーを未然に防ぐために欠かせないツールです。

2. 基礎知識:LBOUNDとUBOUNDとは?

LBOUND(Lower Bound)とUBOUND(Upper Bound)は、配列の次元ごとのインデックスを取得する組み込み関数です。
LBOUND(配列, 次元):指定した次元の「開始インデックス」を返します。
UBOUND(配列, 次元):指定した次元の「終了インデックス」を返します。
これにより、配列の添字が「1からNまで」であっても、「0からN-1まで」であっても、コードを書き換えることなくループ処理を安全に実行できます。

3. 実装/解決策:ループ範囲の指定

配列全体を処理する際、数値を直接書き込む(例:1から100まで)のは避けましょう。配列のサイズが変わった際に修正漏れが発生するリスクがあるからです。代わりに、LBOUNDとUBOUNDを使うことで、プログラムが配列の構造を自律的に判断するように設計します。

4. サンプルプログラム

以下のコードをコピーして、Fortranコンパイラで実行してみてください。インデックスが1以外から始まる配列でも、問題なく動作することを確認できます。

プログラム例:
program array_bounds
implicit none
! 0から5まで、計6個の要素を持つ配列を定義
integer :: arr(0:5)
integer :: i

! 配列に値を代入
arr = (/ 10, 20, 30, 40, 50, 60 /)

! LBOUNDとUBOUNDを使ってループ範囲を決定
! これにより、配列の添字がどう定義されていても安全に処理できる
print , “配列の要素を表示します:”
do i = lbound(arr, 1), ubound(arr, 1)
! i番目の要素を出力する
print , “インデックス”, i, “: 値 =”, arr(i)
end do

end program array_bounds

5. 応用・注意点:現場での活用と落とし穴

現場の開発では、多次元配列を扱うことが一般的です。その際、第2引数で次元を指定するのを忘れないようにしましょう。
注意点:多次元配列の場合、`UBOUND(arr)` だけでは全次元の範囲が返ってきてしまい、ループのインデックスとして正しく機能しません。必ず `UBOUND(arr, 1)` のように「何次元目か」を明示してください。
また、サブルーチンに配列を渡す際も、引数として受け取った配列に対してこれらの関数を使うことで、汎用性の高い(どんなサイズの配列でも処理できる)計算モジュールを作成することが可能です。常に「数値を直接書かず、関数で取得する」癖をつけることが、バグを防ぐ近道です。

コメント

タイトルとURLをコピーしました