【问题标题】:INITIALIZE gives garbage value on PIC X and PIC S9 COMP variablesINITIALIZE 在 PIC X 和 PIC S9 COMP 变量上给出垃圾值
【发布时间】:2019-03-12 19:06:30
【问题描述】:

初始化以下变量时:

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


    【解决方案1】:

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

    INITIALIZE BATCH-VERSION BATCH-REC-01
    

    这会将基本字段初始化为SPACESZEROS,具体取决于它们的PICTUREBATCH-FIELDS 不会被初始化。


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

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

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

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

    【讨论】:

    • 这解释了很多。谢谢里克
    【解决方案2】:

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

    无论如何,我同意@RickSmith 的观点,并相信他对您问题的解决方案是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多