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(<関数名>, "<ライブラリー名>/<プログラム名>")
の形式で記述するとライブラリー・リストに左右されることなく明示的に
外部プログラムを呼び出すことができるようになる。
これを早速すべてのプログラム・ソースに反映させることによって
製品の品質を高めることができるようになった。