DIVIDE WS-ENT-CNYR-RED BY 4 GIVING WS-DT-CNYR
REMAINDER WS-YR-REMAINDER ON SIZE ERROR.
这是什么意思?
答案 0 :(得分:8)
DIVIDE
是一个COBOL动词,允许你进行除法,就像在数学中一样。
本手册和其他数学动词将在您的手册和课程笔记中介绍。
你显示的实际DIVIDE在语法上是不正确的:你应该有一个"命令性陈述"在ON SIZE ERROR短语之后。没有合理的COBOL编译器会允许该语句编译。
DIVIDE在做什么?这可能是闰年检查的开始。如果一年可以被4整除,则它是一个闰年候选者(除非可以被400整除,否则它也不能被100整除)。
除法的结果放在GIVING之后的数据名称中,剩下的是"剩下的"来自分区的地址位于REMAINDER之后的数据名称中。
通常在使用REMAINDER时,它将与整数划分,这对于成为一年是有意义的。 2015年除以4得到503,其余为3。不是闰年。
在这种情况下,ON SIZE ERROR应该是多余的。它除以文字(4),除非结果字段不足以包含结果,否则永远不会出现SIZE ERROR。
数据定义应该是:
ll WS-ENT-CNYR-RED PIC 9(4).
ll WS-DT-CNYR PIC 9(3).
ll WS-YR-REMAINDER PIC 9.
除非年度价值非常大,否则WS-DT-CNYR需要为9(4)。 ll是一个级别号,它将在01-49(或1-49)或77之间。
WS-YR-REMAINDER上应出现88级条件名称,如:
88 could-be-leap-year VALUE ZERO.
在COBOL中看到GIVING很常见。如果未使用GIVING,则结果存储在语句中提到的其中一个字段中(您应该检查DIVIDE,MULTIPLY
,ADD
和SUBTRACT
)。
REMAINDER你只能看到"模数"需要一个部门。
除非指定了ROUNDED短语,否则不会对结果进行舍入,并且使用REMAINDER进行舍入没有多大意义。
在此示例中,只有WS-ENT-CNYR-RED 必须为数字项。 WS-DT-CNYR和WS-YR-REMAINDER都可以是数字编辑的项目。格式化报告行时,GIVING上的项目通常会进行数字编辑。在这个开始闰年检查的典型代码中,很可能所有都是数字的,并且所有都是整数。
根据三个项目的使用量以及它们的使用方式,可以将它们定义为PACKED-DECIMAL(或者任何COMPUTATIONAL-?项目为该编译器的压缩十进制数)或甚至二进制。
这是必要这是闰年检查的开始。除以4可能还有其他原因需要知道余数。
请注意,DIVIDE ... INTO
...也有效。实际上,1985年COBOL标准(以及之前的标准)中记录了DIVIDE语句的五种不同格式,您应该在手册中看到这些格式。
ON SIZE ERROR告诉编译器在出现" size error"发生。 A"尺寸错误"是指结果不适合为其提供的字段。
ON SIZE ERROR
imperative-statement.
或
ON SIZE ERROR
imperative-statement.
END-... (scope-delimiter, consists of END- prefix and verb used, in this case `END-DIVIDE`).
命令式语句可以是多个语句,但通常是一个(将结果字段设置为默认值,通常为零)。因为它可以是多个语句,所以终止语句非常重要,否则你会将意外的代码作为命令式语句的一部分。
许多人认为ON SIZE ERROR仅针对"除以零",但事实并非如此。如果由于字段的大小而导致结果不适合字段,则大小错误"已经发生了。
我没有使用ON SIZE ERROR。我确保非零除数,并且所有结果字段都足够大以包含预期结果。
因为我没有使用ON SIZE ERROR,所以我不知道REMAINDER是否也会导致尺寸错误。我会检查: - )
好的,我已经查过了。这是IBM的企业COBOL,除了Extensions之外,它是1985标准。如果REMAINDER字段太小而无法容纳余数,则将对 进行操作。所以要非常小心余数字段的大小,因为无法知道哪个字段导致了大小错误。
记录如下:
SIZE ERROR短语对于格式1,2和3,请参阅“SIZE ERROR短语” 第296页。 对于格式4和5,如果出现大小错误 商,没有余数计算是有意义的。因此, 商字段(标识符-3)和余数字段的内容 (标识符-4)不变。如果剩余部分出现大小错误, 余数字段(标识符-4)的内容不变。在 无论是哪种情况,您都必须分析结果以确定哪些 情况确实已经发生。
格式4和5使用REMAINDER。
如果您没有指定ON SIZE ERROR,那么行为将归结为单个编译器和运行时选项。企业COBOL将截断字段,但只有在进入运行时(语言环境)后才能检查是否还有其他事情要发生。相对于指定ON SIZE ERROR,这将花费大量时间。
因此,请确保您的字段大小正确。如果您不想这样做,请使用ON SIZE ERROR。如果在REMAINDER中使用ON SIZE ERROR,你必须自己确定在做任何事情之前导致SIZE ERROR的原因。
ON SIZE ERROR有一个对应物,而不是大小错误。它的使用类似于ON SIZE ERROR,除了有明显的区别。 ON SIZE ERROR和NOT ON SIZE ERROR可以同时使用:
DIVIDE WS-ENT-CNYR-RED BY 4
GIVING WS-DT-CNYR
REMAINDER WS-YR-REMAINDER
ON SIZE ERROR
imperative-statement-1
NOT ON SIZE ERROR
imperative-statement-2
END-DIVIDE (or .)