如何在Cobol中获得数组的大小?

时间:2012-04-12 19:31:15

标签: arrays cobol

我想在COBOL中得到一个表的长度(我指的是数组中元素的数量)。我见过的惯例通常是对其进行硬编码以匹配工作存储中的事件。但我希望代码获得长度,以便在更改工作存储并重新编译程序时,不需要更改过程除法语句。这既可以减少维护工作量,又可以防止在5000行代码中“丢失”使用,并且可能允许代码位于可以在具有不同表长度的多个程序中使用的复制代码中。

所以这是我提出的唯一解决方案。

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTPROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 THIS-LENGTH    PIC 9(04).
01 THIS-GROUP.
   05 THIS-TABLE  PIC X(20) OCCURS 15 TIMES.
PROCEDURE DIVISION.

    COMPUTE THIS-LENGTH = LENGTH OF THIS-GROUP
                         / LENGTH OF THIS-TABLE.
     DISPLAY LENGTH OF THIS-GROUP ' / ' LENGTH OF THIS-TABLE
             ' = ' THIS-LENGTH.
 EXIT-PROG.
     STOP RUN.

此输出

000000300 / 000000020 = 0015

这样可行,但它非常笨重。它需要围绕行的虚拟组级别,只是为了获得它们的长度。有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我会使用78项目的大小并在OCCURS中使用它然后如果你想让这个大小外部控制你可以在它周围添加一些条件语句......

vanilla可移植的例子是:

  WORKING-STORAGE SECTION.
  78 THIS-TABLE-SIZE VALUE 15.

   01 THIS-LENGTH    PIC 9(04).
   01 THIS-TABLE     PIC X(20) OCCURS THIS-TABLE-SIZE TIMES.
   PROCEDURE DIVISION.
      DISPLAY THIS-TABLE-SIZE.

然而,使用$ if ..示例将是:

  WORKING-STORAGE SECTION.
  $if THIS-TABLE-SIZE defined
  $display THIS-TABLE-SIZE is changed
  $else
   78 THIS-TABLE-SIZE VALUE 15.
  $end

   01 THIS-LENGTH    PIC 9(04).
   01 THIS-TABLE     PIC X(20) OCCURS THIS-TABLE-SIZE TIMES.
   PROCEDURE DIVISION.
      DISPLAY THIS-TABLE-SIZE.

然后默认编译/运行将产生:

Y:\DemoAndTests\size.of>cobol testprog.cbl nologo int();
* Generating testprog
* Data:         800     Code:         464     Literals:         144

Y:\DemoAndTests\size.of>run testprog
15

但如果设定常数......

Y:\DemoAndTests\size.of>cobol testprog.cbl nologo int() constant"THIS-TABLE-SIZE(20)";
THIS-TABLE-SIZE is changed
* Generating testprog
* Data:         896     Code:         464     Literals:         144

Y:\DemoAndTests\size.of>run testprog
20

我也会考虑将78级别转移到字帖上。

答案 1 :(得分:1)

我觉得将它描述为“虚拟组级别”很奇怪。我这样定义:

05  DELIBERATE-DUMMY-GROUP.
    10  FILLER OCCURS 15 TIMES.
        15  ACTUAL-ENTRY-NAME PIC X(20).

通常接下来会是

05  SOMETHING-ELSE PIC something.

如果你有

05  ACTUAL-ENTRY-NAME OCCURS 15 TIMES PIC X(20).
05  SOMETHING-ELSE PIC something.

可以

定义

01  W-ADDRESS-OF-TABLE USAGE POINTER.
01  FILLER REDEFINES W-ADDRESS-OF-TABLE.
    05  W-AOT-AS-NUMBER COMP-5 PIC 9(9).
01  W-ADDRESS-OF-AFTER-TABLE USAGE POINTER.
01  FILLER REDEFINES W-ADDRESS-OF-AFTER-TABLE.
    05  W-AOAT-AS-NUMBER COMP-5 PIC 9(9).

SET W-ADDRESS-OF-TABLE TO ADDRESS OF ACTUAL-ENTRY-NAME ( 1 )
SET W-ADDRESS-OF-AFTER-TABLE TO ADDRESS OF SOMETHING-ELSE

SUBTRACT W-AOT-AS-NUMBER FROM W-AOAT-AS-NUMBER
  GIVING W-LENGTH-OF-TABLE
DIVIDE W-LENGTH-OF-TABLE BY LENGTH OF ACTUAL-ENTRY-NAME
  GIVING W-NO-OF-OCCURENCES

但我更愿意将OCCURS作为小组的一部分。

注意:如果在“SOMETHING-ELSE”之前插入字段而不更改代码以使用新字段,则上述内容将不再有效。如果你碰巧在你的领域拥有它(并且它实际上是“需要的”),它也不适用于SYNC。