为什么';t GnuCOBOL';什么是舍入语法编译?

为什么';t GnuCOBOL';什么是舍入语法编译?,cobol,gnucobol,Cobol,Gnucobol,如果有人能指出我在下面这个非常小、非常琐碎的COBOL程序中到底做错了什么,我将非常感激。它使用COBOL的标准工具,即语言元素舍入,对结果进行舍入。其目的是构建一个大型应用程序,并将时间度量应用于不同的舍入模式,因为每个模式都有一系列操作和后续舍入。(更不可告人的动机是向后学习COBOL,这只是该计划中的一个项目,然后尝试获得一份使用和开发COBOL的工作) 下面列出了该程序。它执行一个简单的加法,结果被传递给一个数据宽度较小的变量,该变量强制执行舍入 000100 IDENTIFICATIO

如果有人能指出我在下面这个非常小、非常琐碎的COBOL程序中到底做错了什么,我将非常感激。它使用COBOL的标准工具,即语言元素舍入,对结果进行舍入。其目的是构建一个大型应用程序,并将时间度量应用于不同的舍入模式,因为每个模式都有一系列操作和后续舍入。(更不可告人的动机是向后学习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)[2012年2月11日版本]程序员指南 第二版,2013年11月21日

其计算语法如下所示

计算{identifier-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上的句点将编译器的状态从查找段落中的另一条语句更改为查找新段落或语句(可能是标签)。

段落/节必须以句号/句点结束。我从您的失败中得到了不同的结果(我使用的是编译器的V2,0,不是1.1版),但仍然是失败。如果您想在SourceForge.net的GnuCOBOL空间中记录这条消息,那么这条消息可能会更好(!),它可能会带来有用的改进。嘿,你甚至可以自己编写代码。一段/一节的结尾必须有一个句号/句号,所以它们都在我的代码中,包括PROGRAM-BEGIN。和程序完成。离故障点最近。编译器通过shell发出的错误消息,哪种消息可能更好?是否要我设置编译器选项,以便在错误消息中包含更多内容?嗯。我觉得我已经很好地缩小了搜索范围。不过,SourceForge是一个很好的下一站。好建议。请稍后再研究。您已经终止了段落标签,但在
PROGRAM-DONE
之前没有终止段落本身。END-COMPUTE不会终止段落,也没有句号/句点,因此编译器遇到程序已完成并认为它是一个标识符。在我的编译器中,它是2.0。你告诉我的一切都很有道理,我对COBOL程序应该如何分配的感觉完全得到你所写内容的证实,只有我的编译器对所有组合都会给出完全相同的错误消息,无论是否没有句点,仅在1020上使用周期,或在计算结束后使用周期。很可能,我的编译器有一个bug,或者GnuCOBOL还没有准备好,很明显这是一个失败的原因。没有理由陷入这样的困境。我是这里的新手,现在还不允许投票,所以我就在这里写一封感谢信,感谢Tiffin先生和Woodger先生的时间和考虑。@Titchmarsh仔细看,您的编译器版本不是2.0,它是一个不支持四舍五入模式的早期版本。尝试使用
COMPUTE RESULT ROUNDED*>模式最接近偶数的版本,注释掉该模式。这不是一个失败的原因,只是一个小插曲。我并不想反驳你,你是GnuCOBOL上的“写这本书的人”,但看看GnuCOBOL的官方托管网站,我注意到最新的可用版本是gnu-cobol-1.1,这是我拥有的版本。我有没有办法利用一个更新的版本,支持四舍五入模式?当然,如您所说,在使用1.1编译后,去掉该模式会得到一个可行的可执行文件。@Titchmarsh是的,GnuCOBOL 2.0在SVN代码库中。在文件部分下,有快照。Simon的最新版本是Rev 658,不会泄露任何秘密,但2.0官方版本候选1大约还有7天。我不喜欢这样的约会,因为作为志愿者,像现实生活这样的事情可能会发生,当人们变得焦虑和不耐烦时,抱着希望可能对自由软件有害。但是,2.0的官方版本即将发布。现在,快照。
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.