首页 > 解决方案 > 在 Cobol 中初始化可变长度

问题描述

我有一本抄写本,内容如下:

(...)
05 ESTGWABC-S-OUT.
   10 ESTGWABC-S-COD-NUM        PIC 9(003).
   10 ESTGWABC-S-DESC-COD       PIC X(020).
   (...)
   10 ESTGWABC-S-VAL-PAY        PIC 9(015)V99.
   10 ESTGWABC-S-QTD-REG        PIC 9(002).
   10 ESTGWABC-S-REG-PEOP    OCCURS 0 TO 20 TIMES
                 DEPENDING ON ESTGWABC-S-QTD-REG.
      15 ESTGWABC-S-CCONTR      PIC 9(009).
      15 ESTGWABC-S-VAL-PAY     PIC 9(015)V99.
   10 ESTGWABC-S-DEPEN          PIC 9(005).
   (...)

在我的程序中,我想在使用它之前对其进行初始化,所以我正在执行以下操作:

INITIALIZE                  ESTGWABC-S-OUT
                            REPLACING ALPHANUMERIC BY SPACES
                                           NUMERIC BY ZEROS

但我得到一个编译错误:

"ESTGWABC-S-OUT" was found in an "INITIALIZE" statement but was variable-length or variably located. The operand was discarded from the "INITIALIZE" statement.

谁能给我一个线索我该如何解决它或者我做错了什么?非常感谢。

标签: initializationcobol

解决方案


谁能给我一个线索我该如何解决它或者我做错了什么?

不要使用INITIALIZE,你没有做错任何事。

基本上,标准COBOL为数据记录的组织设置了规则。然后它定义INITIALIZE语句的行为以正确操作这些数据记录。

可变长度表之后的数据项是“可变定位的”。这不符合标准 COBOL,标准 COBOL 要求任何可变长度数据项(在本例中ESTGWABC-S-REG-PEOP为 )位于record description entry. 的位置ESTGWABC-S-DEPEN将根据表中条目的数量而变化,ESTGWABC-S-REG-PEOP。当表的大小发生变化ESTGWABC-S-DEPEN时将不再是一个初始化的数据项。

要允许使用INITIALIZE,必须更改“字帖”。


以下是如何使用INITIALIZE符合标准的可变长度记录的示例。这是使用带有强制COBOL 85一致性标志的 Micro Focus 编译器完成的。

  $set ans85 flag"ans85" flagas"s"
   identification division.
   program-id. var-len.
   data division.
   working-storage section.
   01  n pic 9(2).

   01  a.
    02  fixed-part.
     03  b pic x(2).
     03  c pic 9(2).
    02  variable-part.
     03  d occurs 0 to 10 depending c.
      04  e pic x(2).
      04  f pic 9(2).

   procedure division.
   begin.
       initialize fixed-part
       perform varying n from 1 by 1 until n > 10
           initialize d (n)
       end-perform
       stop run
       .
   end program var-len.

推荐阅读