COBOL和2,020,202.02美元

2020-11-05 20:04:24

这些年来,甚至在过去的一两年里,我也会在新闻上看到一些人收到了一张账单或支票,金额高得离谱,其形式就是2020202020美元(…)。.02。

如果您曾经看到过这一点,您就知道(几乎可以肯定)这是在COBOL中犯下的编程错误。大多数COBOL程序员都犯过这个愚蠢的错误,我也不例外。

这个问题是由COBOL程序员通常初始化记录的方式引起的。给出这个小程序:

身份鉴定科。 Program-id。 弄错了。 数据部门。 工作储存区。 *输入记录,通常保存在磁盘/磁带上的某个位置。 01 dr-datarec. 03 DR-姓名图片x(20)。 03 DR-数量图片S9(7)v99,组件-3。 *打印记录,发送到行式打印机。 01 dt-详细信息。 03 dt-姓名图片x(20)。 03填充图片x。 03 dt-数量图片z,zzz,zz9.99。程序部。 将空格移动到DR-datarec。 将";test";移至DR-NAME。 将100移至DR-AMOUNT。 将空间移动到DT-Detail。 将DR-Name移至DT-Name。 将DR-Amount移动到DT-Amount。 显示DT-DETAIL。 别跑了。

在本程序中,dr-datarec是输入记录。正常情况下,它会来自某个磁盘。对于这个简单的测试,我将手工创建它。

一旦获得输入记录,就进行计算,然后使用DT-DETAIL打印记录。

问题在于dr-datarec是如何创建的。请注意,我是如何向它移动空格以对其进行初始化的。这是初始化记录的常用方法。

通过这样做,所有PIC X字段中都有空格。但是,所有的COMP-3字段也被初始化,只是不是零。程序员必须确保为任何COMP-3字段创建有效值。在测试程序中,这是正确完成的:

Comp-3将数字存储为4位“半字节”,因此一个空格将显示为数字20。如果您有9个数字,就像DR-Amount那样,它需要10个半字节的存储(9个半字节用于数字,1个半字节用于符号)或5个字节。

将空格移动到DR-DATAREC将导致在字段中存储5个空格或十六进制值2020202020。如果您尝试使用未初始化的变量,则会将其解释为2,020,202.02。

COBOL 85引入了初始化动词来纠正这个问题。不是将空格移动到记录中,而是对其进行初始化,它会将空格移动到字母数字字段,并将零移动到数字字段:

*将空格移动到DR-datarec。 初始化DT-Detail。 将";test";移至DR-NAME。 *将100移至DR-AMOUNT。

因此,下次当你看到一个贫穷的寡妇在水电费账单上收取2,020,202.02美元的费用时,你就会确切地知道这是怎么回事了!