0

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

感谢您的任何帮助。

4

3 回答 3

2

我很高兴你已经解决了这个问题。

仅作记录,您不能在计算中使用已编辑的格式。两个变量的字符串中的字符“Z”PICTURE将变量转换为编译器不认为是数字的。

您确实必须声明一个完整的数字变量(无格式)并将其结果值移动到之后的格式化变量。

于 2012-10-27T19:15:58.100 回答
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
于 2012-10-27T18:49:05.770 回答
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 时的值是无关紧要的。

于 2013-01-20T00:55:09.203 回答