我在使用某些cobol代码时遇到了一些麻烦。在下面的代码中,它会导致这两个错误。当我尝试添加时编译器不喜欢。
CH7PPB.CBL:158: Error: 'NEW-DUES' is not numeric name CH7PPB.CBL:161: Error: 'NEW-INSURANCE' is not numeric name
MOVE UNION-DUES TO OLD-DUES
MULTIPLY UNION-DUES BY .04 GIVING NEW-DUES
ADD UNION-DUES TO NEW-DUES
MOVE INSURANCE TO OLD-INSURANCE
MULTIPLY INSURANCE BY .03 GIVING NEW-INSURANCE
ADD INSURANCE TO NEW-INSURANCE
NEW-DUES和NEW-INSURANCE定义如下。
05 NEW-DUES PIC Z9(4).99.
05 NEW-INSURANCE PIC Z9(4).99.
感谢您的帮助。
答案 0 :(得分:2)
我很高兴你已经解决了这个问题。
仅供记录,您不能在计算中使用已编辑的格式。两个变量的PICTURE
字符串中的字符“Z”将变量视为编译器不被视为数字。
你确实必须声明一个完整的数字变量(没有格式化),然后将其结果值移到格式化变量之后。
答案 1 :(得分:0)
通过使用两个临时变量来解决这个问题,不确定这是否可行,但是有效。
MOVE ANNUAL-SALARY TO OLD-SALARY
MULTIPLY ANNUAL-SALARY BY .07 GIVING TEMP
ADD ANNUAL-SALARY,TEMP TO TEMP2
MOVE TEMP2 TO NEW-SALARY
MOVE ZEROS TO TEMP, TEMP2
MOVE UNION-DUES TO OLD-DUES
MULTIPLY UNION-DUES BY .04 GIVING TEMP
ADD UNION-DUES,TEMP TO TEMP2
MOVE TEMP2 TO NEW-DUES
MOVE ZEROS TO TEMP, TEMP2
MOVE INSURANCE TO OLD-INSURANCE
MULTIPLY INSURANCE BY .03 GIVING TEMP
ADD INSURANCE,TEMP TO TEMP2
MOVE TEMP2 TO NEW-INSURANCE
MOVE ZEROS TO TEMP, TEMP2
答案 2 :(得分:0)
除了NealB建议的COMPUTE之外:
MOVE ANNUAL-SALARY TO OLD-SALARY
MULTIPLY ANNUAL-SALARY BY 1.07 GIVING NEW-SALARY
MOVE UNION-DUES TO OLD-DUES
MULTIPLY UNION-DUES BY 1.04 GIVING NEW-DUES
MOVE INSURANCE TO OLD-INSURANCE
MULTIPLY INSURANCE BY 1.03 GIVING NEW-INSURANCE
在所示代码中使用TEMP2特别糟糕。它首先依赖于它的初始值(可能是一个VALUE子句),并且第二次依赖于块末尾的'MOVE ZEROS TO TEMP,TEMP2'。这是一个糟糕的方式。 TEMP的重复初始化是没有意义的,因为TEMP始终是GIVING的“目标”,因此它在MULTIPLY时的值是无关紧要的。