なぜ「名前付きDOループ」が重要なのか?
プログラミングで計算を行っていると、ループの中にさらにループを入れる「多重ループ」を頻繁に書くことになります。しかし、ループが深くなればなるほど、「このEXITはどのループを抜けるためのものだっけ?」と混乱してしまいがちです。
「名前付きDOループ」は、ループに名前(ラベル)を付けることで、プログラムの可読性を劇的に高め、意図しないループの脱出や誤作動を防ぐための非常に重要なテクニックです。特に数値計算の現場では、複雑な条件分岐が多いため、この書き方を知っているだけでバグを大幅に減らすことができます。
基礎知識:ループの制御構造を知る
通常、ループを途中で中断するには「EXIT」を使います。しかし、デフォルトの「EXIT」は「直近のループ」を抜けるというルールです。
例えば、三重ループの中で一番外側のループを一気に抜けたい場合、通常の「EXIT」だけでは対応できません。そこで登場するのが「名前付きDOループ」です。ループの開始行に名前を付け、その名前を「EXIT」や「CYCLE(次の回へスキップ)」の対象として指定することで、プログラムの制御権を思い通りに操れるようになります。
実装:名前付きループの記述方法
実装は非常にシンプルです。
1. ループの先頭に「名前:」を付けます。
2. その名前を使って「EXIT 名前」や「CYCLE 名前」と記述します。
3. 最後は「END DO 名前」として、どのループの終わりかを明示します。
これにより、コードを読んだ人が「あ、ここで外側の計算ごと終了するんだな」と一目で理解できるようになります。
サンプルプログラム
以下のコードは、行列計算の途中でエラー判定を行い、特定の条件で外側のループまで一気に脱出する例です。
program loop_example
implicit none
integer :: i, j
integer, parameter :: m = 5, n = 5
! 外側のループに “outer” という名前を付ける
outer: do j = 1, m
! 内側のループに “inner” という名前を付ける
inner: do i = 1, n
! 何らかの計算エラーが発生したと仮定
if (i == 3 .and. j == 2) then
print , “エラー発生!外側のループから脱出します。”
! “outer” ループを直接抜ける
exit outer
end if
print , “現在地: j=”, j, ” i=”, i
end do inner
end do outer
print , “ループ終了。”
end program loop_example
応用・注意点:現場での活用と落とし穴
1. 名前を付けるメリット
チーム開発では、他の人が書いたコードを読む機会が多々あります。「END DO outer」と書かれているだけで、開発者は「ああ、ここは階層の深い構造なんだな」と瞬時に把握でき、メンテナンス性が向上します。
2. 陥りやすいバグ
よくあるミスは、ラベル名を付けたのに「END DO」で名前を書き忘れたり、別々のループで同じ名前を使い回したりすることです。これらはコンパイルエラーの原因になります。
3. 適切な命名を
「outer」「inner」のような汎用的な名前だけでなく、計算内容に応じて「row_loop」「col_loop」のように具体的な名前を付けると、さらにコードの意図が明確になります。
名前付きDOループを使いこなして、読みやすくミスのない「プロ仕様」のコードを目指しましょう!

コメント