1. 導入:なぜこのTipsが重要なのか
数値計算の現場で古くから使われているFortranには、変数の初期値を設定する「DATA文」という機能があります。しかし、初心者が最も陥りやすいバグの一つが、このDATA文を「サブルーチンが呼ばれるたびに変数をリセットするもの」だと勘違いしてしまうことです。この誤解は、シミュレーション計算において「前回の計算結果が残ってしまう」という致命的なバグを引き起こします。本記事では、DATA文の正しい挙動と、動的に値をリセットしたい場合の正しい方法を解説します。
2. 基礎知識:DATA文の仕組み
FortranにおけるDATA文は、プログラムがメモリ上にロードされた「一度だけ」実行される初期化処理です。サブルーチン内のローカル変数にDATA文を書くと、プログラム実行開始時にメモリの確保と値の代入が行われます。重要なのは、サブルーチンを何度呼び出しても、2回目以降はDATA文が無視されるという点です。これはレガシーなFortran規格からの仕様であり、現代のプログラミングにおける「変数定義時の初期化」とは意味合いが異なります。
3. 実装・解決策:動的初期化の正しい方法
サブルーチンが呼ばれるたびに変数を「0」にリセットしたい場合は、DATA文ではなく、サブルーチンの先頭で代入文を書くのが正解です。また、Fortran 90以降であれば、変数宣言と同時に初期化を行うこともできますが、これもDATA文と同様に「一度きり」の挙動になるため、リセットが必要な場合は必ず実行文として代入コードを記述してください。
4. サンプルプログラム
以下のコードで、DATA文と代入文の挙動の違いを確認してみましょう。
PROGRAM CheckInitialization
! 3回繰り返し呼び出す
DO i = 1, 3
CALL TestRoutine()
END DO
END PROGRAM
SUBROUTINE TestRoutine
! DATA文による初期化(2回目以降は無視されるため累積してしまう)
DATA count_data /0/
! 代入文による初期化(毎回実行されるため正しくリセットされる)
INTEGER :: count_assign
count_assign = 0
count_data = count_data + 1
count_assign = count_assign + 1
PRINT , "DATA文の値:", count_data, " / 代入文の値:", count_assign
END SUBROUTINE
5. 応用・注意点:現場で役立つアドバイス
現場のレガシーコードを改修する際、古いプログラムの中に「なぜか値が消えない変数」があれば、それは間違いなくDATA文で初期化されています。
回避策としてのポイント:
・計算結果を蓄積したい(静的変数にしたい)意図がない限り、サブルーチン内でのDATA文の使用は避けましょう。
・もし値を保持したいなら、SAVE属性を明示的に付けることで、「この変数は値を保持する設計である」という意図をコード上で明確にできます。
・デバッグ時は「変数が期待通りにリセットされているか」を常に意識し、必要に応じてPRINT文で値の変化を追跡してください。
この「一度きりの初期化」という仕様は、使い方次第では高速な処理に貢献しますが、誤解して使うと数値計算の精度を大きく損なう原因になります。まずは「DATA文=静的な固定値」と覚えておきましょう。

コメント