-1

以下の非常に最小限の、非常に些細な COBOL プログラムで私が間違っていることを正確に指摘してくれると、非常に感謝します。COBOL の標準ツールである言語要素 ROUNDED を使用して、結果の丸めを実行します。隠れた動機は、大規模なアプリケーションを構築し、一連の長い一連の操作とそれに続く各モードの丸めを考慮して、さまざまな丸めモードに時間メトリックを適用することです。(さらに下層の動機は、COBOL を逆方向に学習することです。これはその計画内のプロジェクトにすぎず、COBOL を使用して開発する仕事に就こうとします)。

プログラムを以下に示します。単純な加算を 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.

以下のように、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 日版] プログラマーズ ガイド第 2 版、2013 年 11 月 21 日

以下のようなCOMPUTE構文を持っています

COMPUTE { 一意名-1 [ 丸めオプション ] } … =|EQUAL 算術式-1 [ サイズ誤差節 ] [ END-COMPUTE ]

修飾子 ROUNDED (上記の rounding-option) の構文は次のとおりです。

                     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 に答える