在 Cobol 中初始化可变长度

Initialize variable-length in 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.

任何人都可以告诉我如何解决它或我做错了什么吗?非常感谢。

Can anybody give me a clue how can I solve it or what am I doing wrong?

不要使用 INITIALIZE 并且你没有做错。

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

可变长度table之后的数据项为'variably located'。这不符合标准 COBOL,后者要求任何可变长度数据项(在本例中为 ESTGWABC-S-REG-PEOP)位于 record description entry 的最后。 ESTGWABC-S-DEPEN 的位置将根据 table、ESTGWABC-S-REG-PEOP 中的条目数而改变。当 table 的大小发生变化时 ESTGWABC-S-DEPEN 将不再是初始化数据项。

要允许使用 INITIALIZE,必须更改 'copybook'。


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

  $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.