【Fortran学習|初心者向け】Fortran開発の必須テクニック!LBOUND/UBOUNDの「第2引数」を使いこなして配列操作をマスターしよう

1. 導入:なぜLBOUND/UBOUNDの「第2引数」が重要なのか

数値計算において、配列のサイズを正しく把握することは非常に重要です。Fortranでプログラムを書いていると、「配列のサイズが実行時に決まる」「サブルーチンで受け取った配列の大きさを知りたい」という場面に必ず遭遇します。ここで単純に配列サイズを固定してしまうと、汎用性の低いプログラムになったり、配列の範囲外アクセスによるクラッシュの原因になります。`LBOUND`や`UBOUND`の第2引数(DIM)を使いこなすことで、多次元配列の各次元を安全かつ柔軟に処理できるようになります。

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

`LBOUND`は配列の「下限(Lower Bound)」を、`UBOUND`は「上限(Upper Bound)」を返す関数です。
通常、Fortranの配列は1から始まりますが、プログラミングの工夫で0や任意の整数から開始させることも可能です。

・LBOUND:配列の添字がどこから始まっているかを取得します。
・UBOUND:配列の添字がどこまで続いているかを取得します。

ここで重要なのが「第2引数(DIM)」です。多次元配列の場合、単に`UBOUND(matrix)`と書くと、すべての次元の情報が配列として返ってきてしまい、扱いが面倒になります。第2引数に次元番号を指定することで、「1次元目の上限」「2次元目の上限」といったように、特定の次元の境界だけをピンポイントで取得できるのです。

3. 実装/解決策:次元ごとに境界を指定する

多次元配列(行列など)をループ処理する場合、各次元の長さを個別に取得するのが鉄則です。例えば、2次元配列`matrix(rows, cols)`を処理する場合、`UBOUND(matrix, 1)`で「行数」を、`UBOUND(matrix, 2)`で「列数」を明確に取得します。これにより、配列の形状が変わっても、コードを書き直すことなく正しく動作する「動的なプログラム」が実現できます。

4. サンプルプログラム:実践的な行列処理

以下のコードは、2次元配列の各要素を安全にループ処理する例です。そのままコピーしてコンパイル・実行してみてください。

! サンプルコード: 配列の境界を動的に取得する
program array_bounds
implicit none
integer, allocatable :: matrix(:, 🙂
integer :: i, j, rows, cols

! 3×4の行列を動的に確保
allocate(matrix(3, 4))

! 配列の各次元の境界を取得する
rows = ubound(matrix, 1) ! 1次元目(行)の上限を取得
cols = ubound(matrix, 2) ! 2次元目(列)の上限を取得

print , “行数:”, rows, “列数:”, cols

! 取得した境界を使ってループを回す
do j = 1, cols
do i = 1, rows
matrix(i, j) = i 10 + j
end do
end do

print , “処理完了”
deallocate(matrix)
end program array_bounds

5. 応用・注意点:現場で役立つアドバイス

コンパイル時の最適化:
現代のFortranコンパイラは優秀です。コンパイル時に配列サイズが定数として確定している場合、`UBOUND`は自動的にその定数値に置き換えられる「最適化」が行われます。そのため、「関数呼び出しのオーバーヘッドを気にしてハードコード(数値を直書き)する」必要はありません。むしろ、メンテナンス性を考えて`UBOUND`を使うのがプロの流儀です。

スライシング時の注意:
配列の一部(スライス)をサブルーチンに渡す際、渡された側のサブルーチンで`UBOUND`を使うと、「受け取った部分配列のサイズ」が返ってきます。元の大きな配列のサイズではないことに注意してください。これは「部分配列を扱う際、その範囲内だけでループを回せる」という大きなメリットでもあります。

バグ回避のコツ:
多次元配列を扱う際は、必ず`1`や`2`といった次元番号を明示的に指定する癖をつけましょう。これにより、コードの意図が明確になり、多次元配列の入れ替えなどの修正時にもバグを未然に防ぐことができます。

コメント

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