3.INITIAL属性 PROGRAM-ID. PROGRAM1 INITIAL. PROGRAM-ID. PROGRAM1. の違い 次の WORKING-STORAGE SECTION を持つプログラムにおいて WORKING-STORAGE SECTION. 01 CNS-AREA. BLW=0000+00 05 CNS-Z1 PIC S9(01) VALUE 1. BLW=0000+00 05 CNS-Z2 PIC S9(01) VALUE 2. BLW=0000+00 05 CNS-Z3 PIC S9(01) VALUE 3. BLW=0000+00 05 CNS-Z4 PIC S9(01) VALUE 4. BLW=0000+00 05 CNS-Z5 PIC S9(01) VALUE 5. BLW=0000+00 05 CNS-X0 PIC X(01) VALUE "0". BLW=0000+00 05 CNS-X1 PIC X(01) VALUE "1". BLW=0000+00 05 CNS-X2 PIC X(01) VALUE "2". BLW=0000+00 05 CNS-X3 PIC X(01) VALUE "3". BLW=0000+00 05 CNS-X5 PIC X(01) VALUE "5". BLW=0000+00 05 CNS-USEKT PIC X(04) VALUE "AP ". BLW=0000+00 05 CNS-GUPJH PIC X(04) VALUE "GD ". BLW=0000+00 05 CNS-BHGJH PIC X(04) VALUE "BD ". BLW=0000+01 05 CNS-YBRJH PIC X(04) VALUE "YB ". BLW=0000+01 05 CNS-SKIJH PIC X(04) VALUE "SK ". BLW=0000+01 05 CNS-61 PIC S9(04) COMP-3 VALUE 61. BLW=0000+01 05 CNS-62 PIC S9(04) COMP-3 VALUE 62. BLW=0000+02 展開は次のページのようになる。 ここで INITIAL を指定した場合は次のページの強調の部分が生成されない。 つまり、INITIAL を指定していない場合 VALUE値は最初に呼ばれた時のみ初期設定するが INITIAL を 指定した場合は呼ばれるたびに VALUE値を初期設定することになる。 頻繁に呼ばれるサブプログラムでは INITIAL を指定しないで二度目以降に呼ばれる時に初期化が 必要な変数のみを個々に初期化する。 - 10 -
(LIT+0) 00000001 D7E3C5E2 E3F0F5C1 00000000 0000012C 00000001 00000130 00000001 (LIT+32) 00000000 00000000 80000000 E2E8E2D6 E4E34040 E2D24040 E8C24040 C2C44040 (LIT+64) C7C44040 C1D74040 00062C00 061C4080 00000000 25C00001 40000808 00000000 (LIT+96) 08800000 000040C0 00014000 08080000 00000802 40000808 00000000 08 GN=5 EQU * OI 316(13),X'80' IPCB=1 TM 316(13),X'40' IPCB=1 BC 1,136(0,11) GN=6(0001B8) ----+ L 2,300(0,13) BLW=0 | MVI 0(2),X'C1' (BLW=0)+0 | MVI 1(2),X'C2' (BLW=0)+1 | MVI 2(2),X'C3' (BLW=0)+2 | MVI 3(2),X'C4' (BLW=0)+3 | MVI 4(2),X'C5' (BLW=0)+4 | MVI 5(2),X'F0' (BLW=0)+5 | MVI 6(2),X'F1' (BLW=0)+6 | MVI 7(2),X'F2' (BLW=0)+7 | MVI 8(2),X'F3' (BLW=0)+8 | MVI 9(2),X'F5' (BLW=0)+9 | MVC 10(4,2),72(10) (BLW=0)+10 PGMLIT AT +68 | MVC 14(4,2),68(10) (BLW=0)+14 PGMLIT AT +64 | 一度目 MVC 18(4,2),64(10) (BLW=0)+18 PGMLIT AT +60 | でない時 MVC 22(4,2),60(10) (BLW=0)+22 PGMLIT AT +56 | ブランチ MVC 26(4,2),56(10) (BLW=0)+26 PGMLIT AT +52 | MVC 30(3,2),79(10) (BLW=0)+30 PGMLIT AT +75 | MVC 33(3,2),76(10) (BLW=0)+33 PGMLIT AT +72 | LA 3,0(0,0) | L 4,296(0,13) BL=1 | ST 3,0(0,4) (BL=1)+0 | ST 3,8(0,4) (BL=1)+8 | ST 3,16(0,4) (BL=1)+16 | MVC 24(8,4),48(10) (BL=1)+24 PGMLIT AT +44 | ST 3,32(0,4) (BL=1)+32 | MVI 40(4),X'0E' (BL=1)+40 | MVI 48(4),X'0F' (BL=1)+48 | GN=6 EQU * ----+ OI 316(13),X'40' IPCB=1 - 11 -
4.バイナリーサーチ化 次の二つのプログラムはテーブルが昇順に並んでいれば同じ結果になる、後ろのプログラムでは、 バイナリーサーチの手法を用いているため、エントリー数が多ければ多いほど実行ステップ数の削減 効果が大きい。 例1) 01 WK-WAI04036. 05 WK-TCTTBL OCCURS 1 TO 300 TIMES DEPENDING ON IA04032-TCTPRBNO ASCENDING KEY IS WK-TCTDATSB INDEXED BY INX. 10 WK-TCTENTNO PIC 9(04) COMP. 10 WK-TCTYOBI1 PIC X(02). 10 WK-TCTDATSB PIC X(04). 10 WK-TCTDATKB PIC X(01). 10 WK-TCTYOKKB PIC X(01). 10 WK-TCTEDTPTN PIC X(01). 10 WK-TCTYOBI2 PIC X(01). PERFORM WITH TEST BEFORE VARYING CTR-WRK1 FROM CNS-B1 BY CNS-B1 UNTIL NOT ( ( CTR-WRK1 <= IA04032-TCTPRBNO ) AND ( WK-KBN = ZERO ) ) IF ( WK-DSYB = WK-TCTDATSB(CTR-WRK1) ) THEN MOVE CNS-C1 TO WK-KBN MOVE CTR-WRK1 TO SV-CTR END-IF END-PERFORM. 例2) 01 WK-WAI04036. 05 WK-TCTTBL OCCURS 1 TO 300 TIMES DEPENDING ON IA04032-TCTPRBNO ASCENDING KEY IS WK-TCTDATSB INDEXED BY INX. 10 WK-TCTENTNO PIC 9(04) COMP. 10 WK-TCTYOBI1 PIC X(02). 10 WK-TCTDATSB PIC X(04). 10 WK-TCTDATKB PIC X(01). 10 WK-TCTYOKKB PIC X(01). 10 WK-TCTEDTPTN PIC X(01). 10 WK-TCTYOBI2 PIC X(01). SEARCH ALL WK-TCTTBL WHEN WK-TCTDATSB(INX) = WK-DSYB MOVE "1" TO WK-KBN SET SV-CTR TO INX END-SEARCH. 詳細は COBOL II のマニュアルを参照 - 12 -
5.データの部分参照をする場合 WORKING-STORAGE SECTION. 01 SUB-WAI04001. ****************************************************************** * RECORD NAME = WAI04001 94/03/29 * レコード名称 = 共通パラメータ引数 ****************************************************************** 05 IA04001-FUKIJOHOCD PIC X(00004). ・ ・ ・ IF (IA04001-FUKIJOHOCD(CNS-Z3:CNS-Z2) NOT = CNS-C00) THEN GO TO SUB2000-EXIT ENDIF この展開は次のようになる LA 0,0(2,4) LR 1,7 LA 14,3140(0,9) L 15,68(0,10) CLCL 0,14 BC 7,1390(0,11) これを次のように変数を使わずにリテラル値を使用すると IF (IA04001-FUKIJOHOCD(3:2) NOT = CNS-C00) THEN GO TO SUB2000-EXIT ENDIF 展開形は次のように変わる CLC 2(2,4),3140(9) BC 7,1314(0,11) リテラル値を使用したことにより、実行ステップ数だけでなく CLCL 命令が CLC 命令に置き変わったこと により CPUタイム も減らすことが出来る。 - 13 -
6.アセンブラからCOBOL II を呼ぶ場合 COBOL II は、COBOL II 以外のプログラムから呼ばれる場合 開始/終了時に ESTAE の設定/解除を行う。 そこでアセンブラのプログラムから、COBOL II の共通サブプログラムを呼ぶような場合は 統一した言語で書き直す。 - 14 - 前のページ 索引に戻る ホームページに戻る