-1

我将非常感谢任何关于我在下面这个非常简单、非常琐碎的 COBOL 程序中到底做错了什么的指针。它使用 COBOL 的标准工具 ROUNDED 对结果进行舍入。别有用心是构建一个大型应用程序并将时间度量应用于不同的舍入模式,给定一系列操作和每种模式的后续舍入。(更别有用心的是倒过来学COBOL,这只是那个计划内的一个项目,然后尝试着找到一份使用和开发COBOL的工作)。

该程序如下所列。它执行一个简单的加法,并将结果传递给具有较小数据宽度的变量,该变量强制舍入。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. ROUNDINGTEST.
000300 ENVIRONMENT DIVISION.
000400 DATA DIVISION.
000500  WORKING-STORAGE SECTION.
000600   01 OPERAND01 PIC S9(2)V9(4) VALUE 1.4745.
000610   01 OPERAND02 PIC S9(2)V9(4) VALUE 1.9874.
000610   01 RESULT    PIC S9(2)V9(2).
000700 PROCEDURE DIVISION.
000800  PROGRAM-BEGIN.
000900   COMPUTE RESULT ROUNDED MODE NEAREST-EVEN
001000     = OPERAND01 + OPERAND02  
001010    END-COMPUTE
001020
001100  PROGRAM-DONE.
001200 STOP RUN.

使用 GnuCOBOL 的编译器进行编译,如下所示,结果如下。

martin@martin-1001PX:~/CobolProjects$ cobc -b ROUNDINGTEST.cob
ROUNDINGTEST.cob: In paragraph 'PROGRAM-BEGIN':
ROUNDINGTEST.cob:11: Error: syntax error, unexpected MODE
martin@martin-1001PX:~/CobolProjects$ 

没有将指示的模式交换为任何其他模式,截断,向小...产生任何变化。注释掉 000900、001000 和 001010 行会给出无错误的响应,因此很明显,问题不是代码早期的级联问题,也不是后来的任何类型的语法错误——而是四舍五入不起作用。

GNU COBOL 2.0(以前的 OpenCOBOL)[11FEB2012 版本] 程序员指南第 2 版,2013 年 11 月 21 日

具有如下的 COMPUTE 语法

COMPUTE { identifier-1 [ rounding-option ] } … =|EQUAL 算术表达式-1 [ size-error-clause ] [ END-COMPUTE ]

以及限定符 ROUNDED(上面的舍入选项)的语法为

                     AWAY-FROM-ZERO
                     NEAREST-AWAY-FROM-ZERO
                     NEAREST-EVEN
 ROUNDED MODE IS     NEAREST-TOWARD-ZERO
                     PROHIBITED
                     TOWARD-GREATER
                     TOWARD-LESSER
                     TRUNCATION

其中“IS”是一个非强制性的可读性选项。

尽管这看起来很紧凑和微不足道,但再多的修订或测试都无法帮助我取得任何成功。任何关于此事的有意义的交流将不胜感激。

4

1 回答 1

1

(这应该是评论,而不是答案,但希望代码清单显示出来)。

正如比尔指出的那样,这很有效:

000100 IDENTIFICATION DIVISION.                                         
000200 PROGRAM-ID. ROUNDINGTEST.                                        
000300 ENVIRONMENT DIVISION.                                            
000400 DATA DIVISION.                                                   
000500  WORKING-STORAGE SECTION.                                        
000600   01 OPERAND01 PIC S9(2)V9(4) VALUE 1.4745.                      
000610   01 OPERAND02 PIC S9(2)V9(4) VALUE 1.9874.                      
000610   01 RESULT    PIC S9(2)V9(2).                                   
000700 PROCEDURE DIVISION.                                              
000800  PROGRAM-BEGIN.                                                  
000900   COMPUTE RESULT ROUNDED MODE NEAREST-EVEN                       
001000     = OPERAND01 + OPERAND02                                      
001010    END-COMPUTE                                                   
001020  .                                                                
001100 PROGRAM-DONE.                                                    
001200 STOP RUN.                                                        

1020 上的句点将编译器的状态从寻找段落中的另一个语句更改为寻找新的段落或语句,这可能是一个标签。

于 2016-02-12T17:48:27.210 回答