Cobol不是数字名称

时间:2012-10-27 18:35:11

标签: cobol gnucobol

我在使用某些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.

感谢您的帮助。

3 个答案:

答案 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时的值是无关紧要的。