MとNの両方が可変長であるCOBOLで2次元MxN配列を定義するにはどうすればよいですか?
可変配列を別の配列内に配置しようとすると、NetExpressで表示されるメッセージは次のとおりです。
COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE
MとNの両方が可変長であるCOBOLで2次元MxN配列を定義するにはどうすればよいですか?
可変配列を別の配列内に配置しようとすると、NetExpressで表示されるメッセージは次のとおりです。
COBCH0144S OCCURS DEPENDING subsidiary to OCCURS only allowed with ODOSLIDE
定義しようとしているのは、「複雑な発生に応じて」構造(複雑なODO)です。
次のように、テーブルが長方形である複雑なODOを定義できます。
01 TABLE-REC.
05 M PIC S9(4) BINARY.
05 N PIC S9(4) BINARY.
05 ROWS OCCURS 10 TIMES DEPENDING ON M.
10 COLUMNS OCCURS 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
秘訣は、Nの宣言がテーブルの変数部分内で発生しないことです。たとえば、次の宣言:
01 TABLE-REC.
05 M PIC S9(4) BINARY.
05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
10 N PIC S9(4) BINARY
10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
宣言は、各行に異なる数の列が含まれている可能性があることを示しているため、エラーが発生します(つまり、長方形のテーブルではありません)。
一般に、COBOLのODO構造が実際に何を「購入」するかについては多くの混乱があります。データ構造のサイズは動的にサイズ変更できるため、メモリを節約するために使用される可能性があるという、よくある、しかし誤った見方があります。ODOがLOCALまたはWORKINGSTORAGEで宣言されている場合、これは絶対に誤りです。COBOLコンパイラーは、MとNの最大値に対応するのに十分なメモリーを割り当てます。
それがあなたを「購入」するのは、メモリ内のデータを物理的に整理するメカニズムです。次のプログラムとそれが表示するものを見てください。
IDENTIFICATION DIVISION.
PROGRAM-ID. EXODO.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 I PIC S9(4) BINARY.
77 J PIC S9(4) BINARY.
01 DIMENSIONS.
05 M PIC S9(4) BINARY VALUE 6.
05 N PIC S9(4) BINARY VALUE 7.
01 TABLE-REC-1.
05 ROWS OCCURS 1 TO 10 TIMES DEPENDING ON M.
10 COLUMNS OCCURS 1 TO 10 TIMES DEPENDING ON N.
20 CELL PIC X(1).
01 TABLE-REC-2.
05 ROWS OCCURS 10 TIMES.
10 COLUMNS OCCURS 10 TIMES.
20 CELL PIC X(1).
PROCEDURE DIVISION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > M
PERFORM VARYING J FROM 1 BY 1 UNTIL J > N
MOVE 'X' TO CELL OF TABLE-REC-1 (I J)
MOVE 'X' TO CELL OF TABLE-REC-2 (I J)
END-PERFORM
END-PERFORM
DISPLAY TABLE-REC-1
DISPLAY TABLE-REC-2
GOBACK
.
表示:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX
ODOバージョンでは、すべてのデータが6 X 7マトリックスに適切に圧縮されていますが、固定テーブルバージョンでは、各行を最大数まで埋めるために多数の「穴」が含まれる10X10マトリックスが保持されていることに注意してくださいOCCURS
。この区別が重要な場合があります(ほとんどの場合、そうではありません)。
私がよく知らないNetExpressを使用しているようですので、次の部分を機能させるためにいじくり回さなければならない場合があります。IBM Enterprise COBOL for Z / OSを使用すると、以下を実行できます。
プログラムでODOを定義して、LINKAGE SECTION
メモリが割り当てられないようにします。これは単なるレコードレイアウトです。次に、必要なテーブルの実際のサイズに十分なメモリを動的に割り当てることができます(つまり、M×N要素)。次のようなものを使用して2つを接続しますSET ADDRESS OF ODO-DATA-STRUCTURE TO mem-address
(CICSではGETMAINを使用し、バッチではCEEGTSTを使用してメモリーを取得します)。これで、最小限のスペースを使用し、上記のレイアウトプロパティにより、適切にインデックスを作成する動的データ構造ができました。
COBOLでODOを使用する(または使用しない)方法は他にもありますが、これらは私が知っている最も一般的な方法です。
OCCURSを定義することにより、多次元可変長配列を定義できます。移動する次元のすべてのレベルに依存します。