1

数値変数の内容を信頼できないため、新しい COBOL V6.2 コンパイラーの NUMCHECK オプションをオフにすることはできません。問題は、これを有効にすると、組織で以前使用していた COBOL 4 と完全に互換性がないことです。具体的には、符号なしのパック変数に X'123C' が含まれている場合、COBOL 4 はそれを受け入れて続行しますが、NUMCHECK(PAC,ABD) を指定した COBOL 6.2 は異常終了し、X'123F' のみを受け入れようとします。これは、アセンブラーが COBOL を呼び出したり、ファイルから読み取ったりすることに関して、私たちにとって実際の問題です。別のオプションや、この動作を修正する PTF はありますか? NUMCHECK がオンの場合に、このような他の非互換性がある場合は、それを指摘していただけますか? ありがとうございました!ゾハル

4

2 に答える 2

3

これは文書化されているとおりに機能しています。それはあなたが聞きたいことではないことはわかっていますが、それがまさにその通りであることもあります。NUMCHECK コンパイル オプションが無効なデータを検出したため、アプリケーションが異常終了しています。

IBM COBOL 6.2 のNUMCLSインストール オプションは、IF NUMERIC クラス テストの動作を管理することに注意してください。その暗黙的なバージョンは、NUMCHECK コンパイル オプションによって生成されます。パックされたデータが符号なしで定義されている場合、つまり

77  XYZ  PIC 999 COMP-3.

ドキュメントは、x'F' の符号ニブルが IF NUMERIC クラス テストに合格する唯一の符号ニブルであることを示しています。符号ニブルのその他の値は無効と見なされます。

Enterprise COBOL 6.2 の IBM ドキュメントからの抜粋...

Table 1. NUMCLS(PRIM) and valid signs

         NUMPROC(NOPFD) NUMPROC(PFD)
Signed   C, D, F        C, D, +0 (positive zero)  
Unsigned F              F

Table 2. NUMCLS(ALT) and valid signs

         NUMPROC(NOPFD) NUMPROC(PFD)
Signed   A to F         C, D, +0 (positive zero)  
Unsigned F              F

IBM COBOL 4.2のNUMCLSオプションのドキュメントの文言は明らかに異なります...

ALT による処理は、16 進数の A から F を有効なものとして受け入れます。

PRIM での処理は、16 進数の C、D、および F を有効として受け入れます。

https://www.ibm.com/support/pages/node/604539#112918で、状況に適用される PTF があるかどうかを確認してください。

IBM に問題を提起することもできますが、ここに問題があります。署名されていないデータがある場合、正 (x'C') または負 (x'D') の符号を示す符号ニブルがあるという議論が成り立つ可能性があります。無効です。これが、NUMCHECK オプションがそのように機能する理由の一部であると思われます。

考えられる解決策には、COBOL プログラムを呼び出すアセンブラー プログラムに、渡されたパック データの符号修正を行わせることが含まれます。最後のバイトの OI かもしれません。ショップの SORT ユーティリティ用のコントロール カードを作成して、フラット ファイル内のパックされたデータを修正できる場合があります。COBOL プログラム内の署名されていないパック データ項目を署名付きに変更できます。

それはすべて、あなたが望む行動に依存します。あなたは、数値変数の内容を信頼できないと言います。つまり、正の値に対して x'C' の代わりに x'A' の符号ニブルが使用される場合がある場合、NUMCLS(ALT) が有効な場合は NUMPROC(NOPFD) を使用できます。

NUMCLS(ALT) が有効な場合、状況に対する別の可能な解決策は、NUMPROC(NOPFD) でコンパイルし、符号付きフィールドを使用して最初にデータを保持することです。ドキュメントによると、データを unsigned フィールドに移動すると符号が修正されます。NUMPROC(NOPFD) は NUMPROC(PFD) ほどには機能しないことに注意してください。

以下は、どの符号ニブルが IF NUMERIC テストを真にするかについてのドキュメントの私の理解の拡張です。これをテストする方法はありません。ドキュメントの暗黙的な言語を明示的なテーブルに変換しようとしているだけです。IBM Enterprise COBOL 4.x と IBM Enterprise COBOL v5 以降の違いを強調しています。

                      SIGN   COBOL 5+ COBOL 4
NUMCLS NUMPROC SIGNED NIBBLE NUMERIC  NUMERIC
ALT    NOPFD   YES    X'A'   TRUE     TRUE
ALT    NOPFD   YES    X'B'   TRUE     TRUE
ALT    NOPFD   YES    X'C'   TRUE     TRUE
ALT    NOPFD   YES    X'D'   TRUE     TRUE
ALT    NOPFD   YES    X'E'   TRUE     TRUE
ALT    NOPFD   YES    X'F'   TRUE     TRUE
ALT    NOPFD   NO     X'A'   FALSE    TRUE
ALT    NOPFD   NO     X'B'   FALSE    TRUE
ALT    NOPFD   NO     X'C'   FALSE    TRUE
ALT    NOPFD   NO     X'D'   FALSE    TRUE
ALT    NOPFD   NO     X'E'   FALSE    TRUE
ALT    NOPFD   NO     X'F'   TRUE     TRUE
ALT    PFD     YES    X'A'   FALSE    FALSE
ALT    PFD     YES    X'B'   FALSE    FALSE
ALT    PFD     YES    X'C'   TRUE     TRUE
ALT    PFD     YES    X'D'   TRUE     TRUE
ALT    PFD     YES    X'E'   FALSE    FALSE
ALT    PFD     YES    X'F'   FALSE    FALSE
ALT    PFD     NO     X'A'   FALSE    FALSE
ALT    PFD     NO     X'B'   FALSE    FALSE
ALT    PFD     NO     X'C'   FALSE    FALSE
ALT    PFD     NO     X'D'   FALSE    FALSE
ALT    PFD     NO     X'E'   FALSE    FALSE
ALT    PFD     NO     X'F'   TRUE     TRUE
PRIM   NOPFD   YES    X'A'   FALSE    FALSE
PRIM   NOPFD   YES    X'B'   FALSE    FALSE
PRIM   NOPFD   YES    X'C'   TRUE     TRUE
PRIM   NOPFD   YES    X'D'   TRUE     TRUE
PRIM   NOPFD   YES    X'E'   FALSE    FALSE
PRIM   NOPFD   YES    X'F'   TRUE     TRUE
PRIM   NOPFD   NO     X'A'   FALSE    FALSE
PRIM   NOPFD   NO     X'B'   FALSE    FALSE
PRIM   NOPFD   NO     X'C'   FALSE    TRUE
PRIM   NOPFD   NO     X'D'   FALSE    TRUE
PRIM   NOPFD   NO     X'E'   FALSE    FALSE
PRIM   NOPFD   NO     X'F'   TRUE     TRUE
PRIM   PFD     YES    X'A'   FALSE    FALSE
PRIM   PFD     YES    X'B'   FALSE    FALSE
PRIM   PFD     YES    X'C'   TRUE     TRUE
PRIM   PFD     YES    X'D'   TRUE     TRUE
PRIM   PFD     YES    X'E'   FALSE    FALSE
PRIM   PFD     YES    X'F'   FALSE    FALSE
PRIM   PFD     NO     X'A'   FALSE    FALSE
PRIM   PFD     NO     X'B'   FALSE    FALSE
PRIM   PFD     NO     X'C'   FALSE    FALSE
PRIM   PFD     NO     X'D'   FALSE    FALSE
PRIM   PFD     NO     X'E'   FALSE    FALSE
PRIM   PFD     NO     X'F'   TRUE     TRUE
于 2018-12-26T22:53:53.060 に答える