【COBOL学習|豆知識】COBOLからC言語の資産を呼び出す!「ADDRESS OF」によるポインタ渡しの極意

1. 導入:なぜポインタ渡しが必要なのか

基幹システムを運用していると、COBOLだけで完結できない場面に遭遇します。高速な処理が必要なライブラリや、OSのAPI、あるいはC言語で書かれた既存の資産を呼び出したい場合です。COBOLの標準的な「参照渡し(BY REFERENCE)」は便利ですが、C言語の関数が「ポインタ(アドレス値)」を期待している場合、そのままではうまく連携できません。ここで重要になるのが「ADDRESS OF」句を用いたポインタ渡しです。これを使えば、C言語側のポインタ引数(voidなど)をCOBOLから正確に制御し、スムーズな外部連携が可能になります。

2. 基礎知識:ポインタとアドレスの仕組み

COBOLにおける「アドレス」とは、メモリ上のどこにそのデータが存在するかを示す位置情報のことです。通常、COBOLではデータ名(変数名)を指定すると、コンパイラが自動的にそのアドレスを対象にして処理してくれます。しかし、USAGE POINTERという形式を使うと、データそのものではなく「アドレス値そのもの」を格納する変数として扱うことができます。これに「ADDRESS OF」を組み合わせることで、特定のデータ領域の先頭番地を取得し、それを外部プログラムへ渡すことができるのです。

3. 実装・解決策

外部のC言語関数を呼び出す際は、CALL文で「BY VALUE」句を使用します。これは「データの中身」を渡すのではなく、「アドレス値という数値」を渡すという意味になります。
基本構文は「CALL “プログラム名” USING BY VALUE ADDRESS OF 変数名」です。これにより、C言語側ではポインタとして正しく受け取ることが可能になります。

4. サンプルプログラム

以下は、メモリ上の領域をC言語側の関数へ渡す際の基本的な書き方です。

IDENTIFICATION DIVISION.
PROGRAM-ID. CALL-C-PROG.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 外部関数に渡したいデータ領域

01 WS-REC.
05 WS-ID PIC X(05).
05 WS-NAME PIC X(20).

PROCEDURE DIVISION.
MOVE “A001” TO WS-ID.
MOVE “COBOL-TIPS” TO WS-NAME.

  • ADDRESS OF で WS-REC の先頭アドレスを取得し、
  • BY VALUE でそのアドレス値をC言語関数に渡す

CALL “C-FUNC” USING BY VALUE ADDRESS OF WS-REC.

STOP RUN.

5. 応用・注意点

現場で最も注意すべきは「メモリの寿命」です。ADDRESS OFで渡したアドレス先が、呼び出し先の関数が実行されている間に解放されたり、別の処理で再利用されたりしないよう注意してください。また、ポインタ渡しは強力な反面、誤ったアドレスを渡すとセグメンテーション違反(異常終了)を引き起こす原因となります。渡すデータ領域は、プログラム全体で有効なWORKING-STORAGE SECTIONに定義しておくのが鉄則です。また、相手先が期待しているのが「構造体のポインタ」なのか「文字列のポインタ」なのか、ヘッダーファイルや仕様書を必ず確認してから実装してください。

コメント

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