4

我想在 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

所以这行得通,但它很笨重。它需要围绕行的虚拟组级别,只是为了获得它们的长度。有一个更好的方法吗?

4

2 回答 2

3

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

香草便携式示例将是:

  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 级移至字帖。

于 2013-01-17T15:18:59.347 回答
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(实际上是“需要的”),它也不会与 SYNC 一起使用。

于 2013-01-16T12:46:21.393 回答