導入:なぜ今、古い仕様を知る必要があるのか
数値計算の現場では、数十年前から稼働している古いFortranプログラム(レガシーコード)を保守・改修する機会が多々あります。その際、ソースコードの中に突然現れる「10H…」といった謎の記述に戸惑ったことはありませんか?これは「H編集記述子(Hollerith constant)」と呼ばれる、現代では非推奨となっている古い文字列出力手法です。なぜこれが重要かというと、この記述を理解していないと、出力結果が壊れた際に原因を特定できず、修正すらままならないからです。
基礎知識:H編集記述子とは何か
H編集記述子は、FORMAT文の中で「文字列の長さ」を数値で指定し、その直後に「H(Hollerithの頭文字)」を置き、続けて文字列を記述する手法です。例えば「10HResult is 」と書くと、最初の数値「10」が後に続く文字列の文字数を表します。
現代のFortranでは、シングルクォーテーションで囲む `’Result is ‘` という書き方が標準ですが、昔の規格(FORTRAN 77以前)ではこの方法が一般的でした。
実装と解決策:なぜ危険なのか
この手法の最大の問題は、「人間が文字数を数えなければならない」という点です。もし「10HResult is 」と書くべきところを誤って「9HResult is 」と書いてしまうと、プログラムは最初の9文字(Result is)だけを読み取り、残った「 」(スペース)を次のデータ出力用として誤認します。その結果、以降の数値データが本来の位置からズレて出力される「カラムズレ」が発生します。
解決策はシンプルです。可能であれば、コードを現代的な `’…’` (引用符)による記述へ全面的に書き換えることを強く推奨します。
サンプルプログラム:新旧記述の比較
以下のコードは、レガシーなH編集記述子と、安全な現代的記述を比較したものです。
! H編集記述子と現代的記述の比較
PROGRAM Example
REAL :: value = 123.45
! 【非推奨】H編集記述子(文字数を数え間違えると出力が崩れる)
! 11文字なので11Hと記述している
PRINT 100, value
100 FORMAT(11HVALUE IS , F10.2)
! 【推奨】現代的な引用符による記述(文字数を数える必要がない)
PRINT 200, value
200 FORMAT('VALUE IS ', F10.2)
END PROGRAM Example
応用・注意点:現場での回避策
古いコードを読み解く際は、以下の点に注意してください。
1. 文字数のカウントミス: レガシーコードを改修する際、文字列を変更するなら、必ず先頭の数値(文字数)も正確に更新してください。
2. 全角文字の混入: 昔のコードに全角文字が混じっていると、バイト数と文字数の計算が合わず、コンパイルエラーや予期せぬ挙動を引き起こします。
3. 段階的移行: 大規模なプログラムの場合、一気に書き換えると別のバグを誘発する恐れがあります。まずは新しい出力が必要な箇所から、クォーテーション方式で書き直していくのが最も安全なアプローチです。
レガシーな手法は「動くから」といって放置されがちですが、保守性を高めるためには、こうした古い記述を現代的な書き方に置き換えるリファクタリングが重要です。

コメント