typedef構造体を関数の結果の変数として上位のプログラムに
EXPORTしている場合、変数が正しく渡されないというトラブルに
見舞われることがある。
何度見直してもどこにも間違いがないはずなのに
受取った変数の値にスレが生じる場合がある。
特に問題になるのはC言語のサービス・プログラム(*SRVPGM)から
上位がRPGやCOBOLである場合である。
_
[例]
0073.00 typedef struct { 0074.00 char fldnam[10]; 0075.00 char flddmy[1]; 0076.00 char fldtyp[1]; 0077.00 char fldusg[1]; 0078.00 int fldott; 0079.00 int fldinp; 0080.00 int fldbyt; 0081.00 int fldkta; 0082.00 int flddec; 0083.00 char fldtxt[50]; 0084.00 char fldhns[2]; 0085.00 int fldhnl; 0086.00 char fldhng[64]; 0087.00 char fldch1[20]; 0088.00 char fldch2[20]; 0089.00 char fldch3[20]; 0090.00 } FLDBUF; 0091.00 FLDBUF fldbuf;
–
[解説]
このような構造体を結果の変数として上位のプログラムに渡すと
各要素のあいだに不明なスペースが不定期に挿入されていたりする。
この原因はC言語のコンパイラーが勝手に変数のあいだに
スペースを挿入してしまうからである。
このことはIBM マニュアルにも書かれていない。
ではどうすれば解決するだろうか?
[解決方法]
typedef structではなく typedef _Packed struct に変更する。
typedef _Packed struct { /* フィールド構造体 */ char field[11]; /* フィールド名 */ char fldType; /* タイプ */ long fldLen; /* フィールド長 */ int fldDec; /* 小数桁 */ char fldUse; /* 使用方法 */ char value[512]; /* 値 */ char fldIO; /* O= 出力 B= 入力 */ int fldByte; /* バイト数 */ int fldPos; /* 開始位置 */ char file[11]; /* ファイル */ int valchk; /* 妥当性検査の数 */ char values[31]; /* VALUES */ int vallen; /* VALUES 変換長 */ char colhdg[21]; /* 欄見出し */ char fldtxt[51]; /* テキスト */ char edtcde; /* 編集コード */ char edtwrd[32]; /* 編集語 */ char mask[256]; /* 編集マスク */ int msklen; /* マスク長 */ int rcvlen; /* API 受取り長 */ char zerobal; /* Zero balance fill character * } FLDBUF; FLDBUF m_fldbuf;
[解説]
typedef _Packed structを使うとコンパイラーが変数のあいだに
スペースを挿入するようなことはしない。
_
このテクニックはC言語に相当精通している人しか知らないテクニックであるので
ぜひ覚えておいて頂きたい。