我有以下字段:
FLD1 PIC ---.--9,99.
FLD2 PIC ---.--9,99.
FLD3 PIC S9(6)V99.
MOVE FLD1 TO FLD2 --> 4038 abend
MOVE FLD1 TO FLD3 --> 4038 abend
当我将FLD1移动到FLD2时,我得到一个4038异常终止,所以我试图先将FLD1移动到FLD3,然后将FLD3移动到FLD2,但这也会产生4038异常终止。当FLD1是空格时没有问题,但是当它没有问题时,就会出现4038异常终止。
这是异常终止:
ABEND = S000 U4038 REASON = 00000001 048
IGZ0063S在行号14982的AO6043中的数字编辑发送字段中检测到无效符号。从编译单元AO6043在入口点AO6043处编译单元偏移+00020024处,在入口偏移处+00020024处在地址1BC20024处。
那么如何在没有异常终止的情况下将FLD1移动到FLD3?
答案 0 :(得分:3)
移动到数字编辑字段唯一有意义的是数字字段。没别了。
仅将数字编辑字段移动到字母数字字段才有意义。没别了。
编辑:我错过了在COBOL 85中你可以将数字编辑的字段移动到数字字段以“去编辑”它。但这看起来并不像预期的那样。话虽如此,如果你知道你想要一个严格的逐位复制并且字段是相同的定义,如上面的FLD1和FLD2,你可以使用这个 hack < / EM>:
MOVE FLD1(1:) TO FLD2(1:)
答案 1 :(得分:3)
现在我们知道了这个消息,我们可以非常清楚问题是什么。
数据中的第一个非空白字符应为-
或数字,但不是。
您可能会发现这有用:https://stackoverflow.com/a/22387920/1927206
当我们等待时,猜测:
您的数据是固定格式,右对齐,但包含前导+
或其他一些既不是-
,也不是数字的字符。这将为您提供U4038运行时错误,并显示描述问题的消息。实际上,您可能会在两个单独的数据集中获取消息,即失败步骤中的LE Abend和sysout。您网站的设置可能有所不同,但您应该在某个地方找到该消息。
本案例中的信息是:
IGZ0063S An invalid sign was detected in a numeric edited sending field
in XXXXXXXX on line number XX. From compile unit XXXXXXXX at
entry point XXXXXXXX at compile unit offset XXXXXXXX at entry
offset XXXXXXXX at address XXXXXXXX.
当程序运行时,所有X都依赖于您的实际程序和环境。
答案 2 :(得分:0)
在此处稍作旁边,您的数字编辑字段FLD1
和FLD2
不足以存储与数字字段FLD3
相同的大小数字。
如果您尝试:
MOVE -123456,78 TO FLD3.
那很好,但如果你尝试:
MOVE -123456,78 TO FLD1.
DISPLAY FLD1.
你会得到&#34; -23.456,67&#34;。
您还需要一个&#39; - &#39;在数字编辑的字段中,数字字段中有9个。这与&#39; Z&#39;可以具有相同位置数的字符。
例如,PIC Z(6)
可以保持/显示与PIC 9(6)
相同的位数。但是PIC -(6)
只能保持/显示5位数字,即使它是正数。