INITIALIZE为PIC X和PIC S9 COMP变量提供垃圾值

问题描述 投票:3回答:2

初始化以下变量时:

01  BATCH-REC.
       03  BATCH-VERSION             PIC X(2).
       03  BATCH-FIELDS              PIC X(682).
       03  BATCH-REC-01 REDEFINES BATCH-FIELDS.
           05  B01-OH-DTL-REC.
               07  B01-PE-ID         PIC X(12).
               07  B01-PMT-DISC-TERMS PIC S9(4) COMP.
               07  B01-PMT-DISC-AMT  PIC S9(18) COMP.

使用命令

INITIALIZE BATCH-REC.

变量B01-PMT-DISC-TERMS初始化为值+08224,B01-PMT-DISC-AMT初始化为+314885530818453536。原因是什么?在初始化之后将空格移动到这些变量是不是一个好主意?我不想更改BATCH-REC代码以在它们上添加默认值。

cobol
2个回答
7
投票

INITIALIZE语句不会初始化重新定义的字段。如果要初始化重新定义的字段,则必须以某种方式识别它们。例如,

INITIALIZE BATCH-VERSION BATCH-REC-01

这将根据他们的SPACES将基本字段初始化为ZEROSPICTUREBATCH-FIELDS不会被初始化。


在这种情况下,以下第3项适用。从2002年的INITIALIZE标准:

5)每个隐式MOVE或SET语句中的接收操作数通过按顺序应用以下步骤来确定:

a)首先,以下数据项被排除为接收操作数:

  1. 除了类别数据指针,对象引用或程序指针的数据项外,任何无效接收MOVE语句操作数的标识符。
  2. 如果未指定FILLER短语,则具有显式或隐式FILLER子句的基本数据项。
  3. 从属于identifier-1的任何基本数据项,其数据描述条目包含REDEFINES或RENAMES子句,或从属于其数据描述条目包含REDEFINES子句的数据项。但是,identifier-1本身可能具有REDEFINES子句,或者从属于具有REDEFINES子句的数据项。

5
投票

在这种情况下,我认为你会发现你的INITIALIZE语句确实将你的PIC X数据初始化为空格。您对B01-PMT-DISC-TERMS的值为x'2020',B01-PMT-DISC-AMT的值为x'2020202020202020',前导数字被截止,可能是由于报告的值仅限于18位数的图片子句。

无论如何,我同意@RickSmith并且相信他在解决你的问题方面是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.