1

別のテーブルのインデックスを使用してテーブル要素 (インデックスのないテーブル) にアクセスすると、IBM ホストでテーブル オーバーフロー エラーが発生する可能性があります。しかし、GnuCOBOL (以前の OpenCOBOL) を使用している場合、同じプログラムがクラッシュしたりメッセージが表示されたりすることはありません (デバッグ オプションを使用しても)。

例えば

    IDENTIFICATION DIVISION.
    PROGRAM-ID.    TSTPROGX.
    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01  IX                         PIC 9(04) COMP VALUE ZERO.
    01  VARS.
        05  S-PART-C.
            10  S-DETAIL      OCCURS 100 TIMES
                                    INDEXED BY S-SUB.
                15  S-ACTUAL  PIC 9(06) VALUE ZERO.
                15  S-ACTUAL-A
                                    REDEFINES S-ACTUAL
                                    PIC X(06).
                15  S-GRADE   PIC X(02) VALUE LOW-VALUE.
        05  POS-USED-ARRAY          PIC X(999)
                                   VALUE SPACE.
        05  FILLER                  REDEFINES POS-USED-ARRAY
                                              OCCURS 999.
            10  FILLER-X            PIC X .
                88  POSITIONS-USED-X          VALUE 'T'.
    PROCEDURE DIVISION.
        SET S-SUB TO 1
        PERFORM VARYING IX FROM 1 BY 1 UNTIL IX > 999
           SET S-SUB TO IX
           SET POSITIONS-USED-X(S-SUB) TO TRUE
           DISPLAY IX ":" FILLER-X(S-SUB)
        END-PERFORM
        GOBACK.

この種の使用を避けるために警告を発行するコンパイラ オプションはありますか?

このエラーは、別のテーブルのインデックス (S-SUB) を使用する代わりに、変数 'IX' を使用するなど、正しい使用法を使用することで回避できます。

SET POSITIONS-USED-X(I-X) TO TRUE

一般に、(異なるサイズの) 独立したテーブルのインデックスを交換するのは誤りのようです。

4

1 に答える 1

3

ホストとは、エンタープライズ COBOL を使用するメインフレームを意味すると仮定すると、最初に含めたリンクに答えがあります。

Enterprise COBOLでは、あるテーブルのインデックスを使用して、インデックスを持たないテーブル(例のように)でも別のテーブルのデータを参照できますが、OCCURSに従属するデータの長さが同じでない限り、期待どおりの結果が得られます。

Enterprise COBOL とコンパイラ オプション SSRANGE を使用すると、質問のコードは失敗します (ご存知のとおり)。どこで失敗しますか?インデックス S-SUB に関連付けられた OCCURS の長さは 8 バイトです。その長さは、インデックス S-SUB に効果的に「組み込まれています」。999 (2 番目のテーブルの長さ) を 8 で割ると 124 (残りは無視) になるため、S-SUB を 124 に設定しても問題ありませんが、125 に設定しても問題はありません。 999 バイト。

GnuCOBOL では、インデックスに長さが組み込まれておらず、テーブル内の発生に直接関連する単純な整数です。ただし、最大 100 になると、最初のテーブル (コンパイラ/ランタイム チェックがない場所) のオーバーフローが始まり、125 参照後に 2 番目のテーブルの終わりを超え、コンパイル オプションに -g を指定すると、 GnuCOBOL コンパイラーによって生成された C プログラムでストレージがどのように (およびどのくらい) 割り当てられるかによってクラッシュします。225 はクラッシュが発生する可能性のある最初のポイントですが、その時点では発生しない可能性があり、後で発生する場合も発生しない場合もあります。

基本的に、コードが機能することを実際に期待できる方法はありません。GnuCOBOL でそれをチェックするようにコンパイラを設定する方法を知りたいだけです。現在、できません。

通常、テーブル内の最大エントリを保持するために定義されたフィールドと、使用されている数を示すために定義された別のフィールドがあります。エントリを使用するときは、最初にテーブルがいっぱいでないことを確認します。

LENGTH OF/を使用FUNCTION LENGTHして、テーブルの最後を越えないようにすることもできます。

2 つのアプローチを組み合わせることができます。

ここで役立つGnuCOBOLのスイッチがありません。これ-gは C コンパイラにまで及びます。それはあなたに何かを与えますが、すべてではなく、依存するだけです。

IXまた、私の考えでは、名前付きの添字に使用するデータ名と名前付きのインデックスを持つことは良い考えではありませんS-SUB。それはプログラムの人間の読者を混乱させるでしょう。

さまざまなテーブルのインデックスの使用に関する詳細については、https ://stackoverflow.com/a/36254166/1927206 の回答を参照してください。

IBM Enterprise COBOL は、インデックスを使用して参照されるストレージが、参照される要素が従属しているテーブル内にあることを確認できます。これは、コンパイラー・オプション SSRANGE で行われます。テーブル外のデータが参照されている場合 (何らかの添字付けまたは参照変更によって)、実行時診断メッセージが生成されます。最新の Enterprise COBOL コンパイラを除くすべてのコンパイラでは、この問題によって「異常終了」(「異常終了」) が発生します。最新のコンパイラには、より詳細に制御できるサブオプションがいくつかあります。

これは、テーブルの「境界」を厳密にチェックしているわけではありません。1 次元テーブルの場合、テーブル参照チェックは境界チェックと一致します。多次元テーブルの場合はそうではありません。添字の 2 番目以降のレベルは「間違っている」可能性がありますが、テーブル外への参照を引き起こさない限り、問題はありません。

GnuCOBOL/OpenCOBOLでは添字の使用や添字・参照修飾によるテーブル参照のチェックはありません。これを自分で追加することを検討したい場合は、大歓迎です。または、機能リクエストとして投稿することもできます。https://sourceforge.net/p/open-cobol/discussion/?source=navbaringにアクセスしますが、すべてではありません。

さまざまなテーブルのインデックスの使用に関する詳細については、https ://stackoverflow.com/a/36254166/1927206 の回答を参照してください。

IBM Enterprise COBOL は、インデックスを使用して参照されるストレージが、参照される要素が従属しているテーブル内にあることを確認できます。これは、コンパイラー・オプション SSRANGE で行われます。テーブル外のデータが参照されている場合 (何らかの添字付けまたは参照変更によって)、実行時診断メッセージが生成されます。最新の Enterprise COBOL コンパイラを除くすべてのコンパイラでは、この問題によって「異常終了」(「異常終了」) が発生します。最新のコンパイラには、より詳細に制御できるサブオプションがいくつかあります。

これは、テーブルの「境界」を厳密にチェックしているわけではありません。1 次元テーブルの場合、テーブル参照チェックは境界チェックと一致します。多次元テーブルの場合はそうではありません。添字の 2 番目以降のレベルは「間違っている」可能性がありますが、テーブル外への参照を引き起こさない限り、問題はありません。

GnuCOBOL/OpenCOBOLでは添字の使用や添字・参照修飾によるテーブル参照のチェックはありません。これを自分で追加することを検討したい場合は、大歓迎です。または、機能リクエストとして投稿することもできます。https://sourceforge.net/p/open-cobol/discussion/?source=navbarにアクセスしてください

于 2016-04-07T16:04:02.993 に答える