5

次の可変長テーブルがWORKING-STORAGE...で定義されているとします。

01  SOAP-RECORD.                                           
    05  SOAP-INPUT        PIC X(8)          VALUE SPACES.
    05  SOAP-STATUS       PIC 9             VALUE ZERO.                         
    05  SOAP-MESSAGE      PIC X(50)         VALUE SPACES.
    05  SOAP-ITEMS        OCCURS 0 TO 500 TIMES   
                          DEPENDING ON ITEM-COUNT
                          INDEXED BY ITEM-X.     
        10 SI-SUB-ITEMS   OCCURS 0 TO 100 TIMES
                          DEPENDING ON SUB-COUNT
                          INDEXED BY SUB-X.     
           15 SS-KEY      PIC X(8)          VALUE SPACES.
           15 SS-AMOUNT   PIC -9(7).99      VALUE ZEROS.
           15 SS-DESCR    PIC x(100)        VALUE SPACES.

このプログラムを実行すると、最初にこのテーブルが必要とする可能性のあるスペースを割り当てるのでしょうか、それともメモリの割り当てに関してより動的でしょうか。この句は、変数がインクリメントDEPENDING ONされるにつれてより多くのメモリを割り当てるという意味で、より動的になると思います。ITEM-COUNT同僚が別のことを教えてくれましたが、彼は100%確信していません。ですから、プログラムをできるだけ効率的に構成するために、これがどのように機能するのかを本当に知りたいと思います。

PS:はい、私新しいCOBOLプログラムを書いています!これは実際にはCICSWebサービスです。この言語が死ぬことはないと思います:(

4

2 に答える 2

7

使用しているコンパイラについては言及していませんが、少なくとも現在の2002年のCOBOL標準では、OCCURS ... DEPENDING ON(ODO)データ項目に割り当てられたスペースは動的である必要はありません。(実際には、変化するのはデータ項目の出現回数だけであり、長さではありません。)コンパイラベンダーが標準の拡張を実装している可能性がありますが、この分野で実装しているベンダーはありません。 。

まだ承認されていない次の規格の改訂には、新しいOCCURSDYNAMIC形式の動的容量テーブルのサポートが含まれています。

于 2010-01-04T18:27:13.283 に答える
1

CICSの世界では、OCCURS DEPENDING ON(ODO)を使用して、実行時に動的にサイズ設定されるテーブルを作成できます。ただし、宣言する方法では SOAP-RECORD、最大サイズのレコードを保持するのに十分なメモリが割り当てられます。

次のことを試してください。

まず、に移動SOAP-RECORDLINKAGE SECTIONます。リンケージセクションで宣言されたアイテムには、メモリが割り当てられていません。この時点では、レコードレイアウトしかありません。ITEM-COUNTとの宣言はそのままにしておき SUB-COUNTますWORKING-STORAGE

次に、ポインタと長さを次のWORKING-STORAGEように宣言します。

77 SOAP-PTR       USAGE POINTER.
77 SOAP-LENGTH    PIC S9(8) BINARY.

最後にPROCEDURE DIVISION:配列の次元のサイズをいくつかの実際の値に設定します。適切な量​​のメモリを割り当ててから、2つを接続します。例えば:

MOVE 200 TO ITEM-COUNT
MOVE 15 TO SUB-COUNT
MOVE LENGTH OF SOAP-RECORD TO SOAP-LENGTH
EXEC CICS GETMAIN
     BELOW
     USERDATAKEY
     SET(SOAP-PTR)
     FLENGTH(SOAP-LENGTH)
END-EXEC
SET ADDRESS OF SOAP-RECORD TO SOAP-PTR

これにより、それぞれが15のSI-SUB-ITEMを含む200のSOAP-ITEMを含むSOAP-RECORDを格納するのに十分なメモリのみが割り当てられます。

レジスタは、OCCURSの最大数ではなく、ODOオブジェクト値(ITEM-COUNT、SUB-COUNT)に基づいLENGTH OFたサイズを提供することに注意してください。SOAP-RECORD

非常に重要です...完了したら、メモリの割り当てを解除することを忘れないでください。

于 2010-01-27T18:38:17.907 に答える