【入門編】DIMビルトイン関数による配列要素数の算出 – PL/Iの基本構文とデータ制御実践ガイド

メインフレームの古強者、PL/Iの「配列の境界」を攻略する!

こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきた皆さんにとって、PL/Iという言語は少し「クセが強い古風な貴婦人」のように見えるかもしれませんね。

今日は、そんなPL/Iの中でも、特に新人さんが「あれ?何で値が取れないの?」と頭を抱えがちな`DIM`(Dimension)ビルトイン関数について、その本質を紐解いていこうと思います。

1. まずは「配列の境界」を理解しよう

PL/Iにおいて、配列は単なるメモリの塊ではありません。「どこから始まって、どこで終わるか」という情報(境界値:Bounds)を密接に持っています。

/i
DCL MY_ARRAY(10:20) FIXED BIN(31);

この宣言を見ると、要素数は「20 – 10 + 1」で11個ですよね。
もし皆さんが「この配列、全部で何個入るんだっけ?」と確認したいとき、プログラムの中でわざわざ計算するのはナンセンスです。そこで登場するのが `DIM` 関数です。

`DIM(配列名, 次元数)` と書くだけで、その配列がその次元において何個の要素を持っているかを、コンパイラが自動的に教えてくれるんです。便利でしょう?

2. アスタリスク()の正体:可変長引数の秘密

ここからが少しだけ難易度が上がる「メインフレームあるある」です。
PL/Iでは、サブルーチン(PROCEDURE)に配列を渡す際、サイズを決め打ちせずに「受け取った配列のサイズに合わせる」という芸当ができます。これをアスタリスク記法と呼びます。

/i
/ 配列を受け取る側のプロシージャ /
PROCESS_DATA: PROC(INPUT_ARR);
DCL INPUT_ARR() FIXED BIN(31); / サイズは呼び出し元に任せる! /

DCL ARRAY_SIZE FIXED BIN(31);

/ ここでDIM関数が真価を発揮します /
ARRAY_SIZE = DIM(INPUT_ARR, 1);

PUT SKIP LIST(‘配列の要素数は: ‘ || ARRAY_SIZE);
END PROCESS_DATA;

なぜこれが魔法のように見えるのか?

COBOLであれば、`OCCURS DEPENDING ON`句を使って別途サイズ変数を渡す必要がありましたよね。しかし、PL/Iは違います。配列の境界情報(デスクリプタという裏データ)が、配列本体と一緒にプロシージャへ「同伴」しているのです。

だから、`DIM` 関数を呼ぶだけで、呼び出し元がどんなサイズの配列を渡してきても、即座に「あ、今回は100個ですね」「今回は50個ですね」と正しく把握できるわけです。

3. 実務で遭遇するトラブルの防波堤

現場のバッチ改修でよくあるミスが、「次元数」の指定間違いです。
`DIM(配列名, 1)` なら第1次元、`DIM(配列名, 2)` なら第2次元。これは基本ですが、多次元配列を扱うときは注意してくださいね。

ワンポイント・アドバイス

もし多次元配列の「全要素数」を知りたくなったときは、こう記述します。

/i
DCL TABLE(10, 5) FIXED BIN(31);
DCL TOTAL_COUNT FIXED BIN(31);

/ 第1次元(10) × 第2次元(5) = 50 /
TOTAL_COUNT = DIM(TABLE, 1) DIM(TABLE, 2);

「なんだ、結局掛け算か」と思われましたか?
そうなんです。PL/Iの `DIM` 関数は、あくまで「その次元の要素数」を返すもの。全要素数を一発で出す魔法の関数はありません。でも、これこそがメインフレームの堅実さです。「曖昧さを排除し、プログラムの構造を明確にする」という哲学がここにあるんですね。

まとめ:怖がる必要はありません

PL/Iのコードを初めて見たとき、`DCL` や `PROCEDURE` といったキーワードが並ぶ様子に圧倒されるかもしれません。でも、一つずつ紐解けば、これほど論理的でメンテナンス性の高い言語は他にありません。

  • `DIM(配列, 1)` は、その配列の「器の大きさ」を教えてくれる親切なツール。
  • アスタリスク()は、柔軟な設計を可能にする頼もしい相棒。
  • デスクリプタ(裏情報)のおかげで、サイズをわざわざ引数で渡す苦労はいらない。

次回のバッチ改修でこの関数に出会ったら、ぜひ「ああ、この配列はちゃんと自分のサイズを主張しているんだな」と、優しく見守ってあげてください。

メインフレームの深淵はまだ深いですが、一緒に少しずつ歩いていきましょう。何か詰まったら、いつでもここに戻ってきてくださいね。応援しています!

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