C400

47. 明示的な外部プログラムの呼び出し

C/400 から外部プログラムを呼び出して実行するには linkage を使って

#pragma map(MyPGM, "MYPGM     ")
#pragma linkage(MyPGM, OS)           
void  MyPGM(void);          
    :
  MyPGM();   /* 外部プログラムの実行 */

のようにして実行する。

しかし、上記の記述では外部プログラム : MYPGM はライブラリー・リスト上の

どこかのライブラリーに存在していなければならない。

C/400 解説書には次のように書かれている。

外部プログラムの名前を指定します。

#PRAGMAマップ指示ステートメントが OS400プログラムの命名規則に併せて

指定されていないときは、この名前を10文字以内の大文字で指定しなければなりません。

指定されたプログラム名が長すぎるときは切り捨てられます。

#PRAGMA連携処理中は 255文字より長い文字は 255文字に切り捨てられます。

255文字までの文字に切り捨てられた名前で #PROGMAマップを指定してください。

かなり意味不明の解説である。

筆者は長い間前述の指定を使用していて C/400 ではライブラリー名の指定が

できないものと思い込んでいた。

しかしユーザー・プログラムがライブラリー・リストを変更している場合には

弊社製品のライブラリーがライブラリー・リストから除去されてしまうために

実行時のエラーが発生する事態に出くわしてしまった。

そこで「OS400プログラムの命名規則」というくだりに注目して

ライブラリー/プログラム名 の形式を使って

#pragma map(MyPGM, "MYLIB/MYPGM")
#pragma linkage(MyPGM, OS)           
void  MyPGM(void);

のように変更したところ、あっさり正常に動作した。

このように

#pragma map(<関数名>, "<ライブラリー名>/<プログラム名>")

の形式で記述するとライブラリー・リストに左右されることなく明示的に

外部プログラムを呼び出すことができるようになる。

これを早速すべてのプログラム・ソースに反映させることによって

製品の品質を高めることができるようになった。