はじめに
古いプログラムコードを読んでいると、「DATA文」という記述を見かけることがあります。特に、文字配列を部分的に初期化するような、一見すると少し変わった書き方に出くわすかもしれません。現代のプログラミングでは、もっとシンプルに書ける方法がありますが、なぜこのような記述が存在するのでしょうか?それは、過去のプログラムとの互換性を保つため、そして、時には限られたメモリ空間を効率的に使うための工夫でもありました。このTipsでは、DATA文を使った文字配列の部分初期化について、その仕組みと、古いコードを解読する上でのポイントを解説します。
DATA文とは?基礎知識を理解しよう
DATA文の役割
`DATA`文は、プログラムの開始時に変数にあらかじめ値を設定(初期化)するための命令です。Fortranなどの古い言語でよく使われていました。現代の言語でも、変数を宣言する際に初期値を指定する機能がありますが、`DATA`文はより柔軟で、プログラムの実行開始前にまとめて初期化を行うことができます。
文字配列とは?
文字配列とは、複数の文字をまとめて格納できるデータ型のことです。例えば、「ABC」という文字列を格納するのに、文字配列を使えば「A」「B」「C」といったように、1文字ずつ個別の要素として扱うことができます。
部分初期化とは?
配列全体に同じ値を設定するのではなく、配列の一部分だけ、あるいは特定の位置にだけ値を設定することを「部分初期化」と呼びます。
DATA文による文字配列の部分初期化の実装方法
参考本文で示されている例を見てみましょう。
`DATA (STR_ARR(I:I), I=1, 10) /’A’, ‘B’, …/`
これは、`STR_ARR`という名前の文字配列の、1番目から10番目の要素までを、それぞれ `’A’`, `’B’`, … と初期化するという意味になります。
ここで注目すべきは `(I:I)` という部分です。これは、配列のインデックス(添え字)を指定する範囲を示しており、ここでは `I` 番目の要素、つまり1文字ずつを指しています。そして、`I=1, 10` という記述で、この `I` が1から10まで順番に変化していくことを表しています。
つまり、この記述は「配列 `STR_ARR` の1番目の要素に `’A’` を、2番目の要素に `’B’` を、…、10番目の要素に `’J’` を設定する」という、非常に細かい指定をしているのです。
現代のプログラミングであれば、例えば以下のように書く方が一般的で読みやすいでしょう。
`STR_ARR = “ABCDEFGHIJ”`
しかし、昔のコードでは、メモリの制約や特定の処理のために、上記のような `DATA`文を使った部分初期化が行われていました。
また、`Syntax_example` にある `DATA (S(I:I), I=1,3) /’X’,’Y’,’Z’/` も同様に、「配列 `S` の1番目の要素に `’X’` を、2番目に `’Y’` を、3番目に `’Z’` を設定する」という意味になります。
サンプルプログラム
ここでは、Fortran風の疑似コードで、DATA文による文字配列の部分初期化のイメージを示します。
PROGRAM DATA_SUB_INITIALIZATION
IMPLICIT NONE
CHARACTER(LEN=1), DIMENSION(10) :: char_array
! char_array という名前で、長さ1文字の要素が10個入る文字配列を宣言します。
! DATA文を使って、配列の特定の部分を初期化します。
! ここでは、1番目から3番目の要素に ‘A’, ‘B’, ‘C’ を設定します。
DATA (char_array(i:i), i=1, 3) /’A’, ‘B’, ‘C’/
! 4番目から6番目の要素に ‘X’, ‘Y’, ‘Z’ を設定します。
DATA (char_array(i:i), i=4, 6) /’X’, ‘Y’, ‘Z’/
! 7番目以降の要素は、初期化されていない(不定値となるか、デフォルト値が入る)可能性があります。
INTEGER :: j
! 配列の内容を表示して確認します。
PRINT , “配列の内容:”
DO j = 1, 10
PRINT , “要素 “, j, “: “, char_array(j)
END DO
END PROGRAM DATA_SUB_INITIALIZATION
このプログラムを実行すると、以下のような出力が得られるはずです。
配列の内容:
要素 1 : A
要素 2 : B
要素 3 : C
要素 4 : X
要素 5 : Y
要素 6 : Z
要素 7 :
要素 8 :
要素 9 :
要素 10 :
※7番目以降の要素は、初期化されていないため、環境によっては空白や不定の値が表示されることがあります。
応用・注意点
レガシーコードの読解
この `DATA`文による部分初期化は、現代のコードではあまり見られませんが、古いシステムを保守する際には必須の知識となります。特に、パズルを解くような感覚で、どの部分がどのように初期化されているのかを正確に把握することが重要です。
文字位置の理解
`DATA (STR_ARR(I:I), I=1, 10)` のように `(I:I)` と記述することで、1文字ずつを個別の要素として扱っていることを理解しましょう。もし、配列全体をまとめて初期化したい場合は、`DATA STR_ARR /’ABCDEFGHIJ’/` のように記述するのが一般的です。
互換性と現代的な書き方
前述したように、現代では `STR_ARR = “ABC…”` のような代入文で簡単に初期化できます。もし新規でコードを書く場合は、可読性を考慮して現代的な方法を採用するのがおすすめです。しかし、既存のレガシーコードを修正・拡張する際には、そのコードの書き方を理解し、互換性を損なわないように注意深く作業する必要があります。
この `DATA`文による部分初期化は、一見すると複雑に見えますが、その背後にある「1文字ずつを個別に扱う」という考え方を理解すれば、古いコードも読み解きやすくなるはずです。

コメント