此 COBOL 代码中是否存在无限循环原因?

Is there an infinite loop cause in this COBOL code?

我是 COBOL 编程的新手,所以我试图制作一个示例计算器,但我无法让它工作。 calc 进入无限循环,我没有找到原因,我什至尝试复制类似的代码,但没有成功。那么,这是 OpenCobolIDE 的问题还是代码的问题?

代码:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. Loops.
   ENVIRONMENT DIVISION.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   77 WSS-FIRSTOP          PIC S9(05)V9(04).
   77 WSS-SECONDOP         PIC S9(05)V9(04).
   77 WSS-RESULT           PIC S9(10)V9(04).
   77 WSS-OPERATOR         PIC A(01).
   77 WSS-CHOICE           PIC X(01).

   PROCEDURE DIVISION.
   LOOP SECTION.
   PERFORM 0001-STARTCALC UNTIL WSS-CHOICE = 2.

   STOP RUN.
   STARTING SECTION.
   0001-STARTCALC.
       DISPLAY "1.- CALCULATOR, 2.- EXIT".
       DISPLAY "ENTER:", ACCEPT WSS-CHOICE.
       IF WSS-CHOICE = 1
           PERFORM 0002-DATAREQUEST
           PERFORM 0003-OPERATIONS
       ELSE IF WSS-CHOICE = 2
           STOP RUN
       ELSE
           DISPLAY "ERROR. INVALID OPTION.".

   0002-DATAREQUEST.
   CHOICE SECTION.
       DISPLAY "CALCULATOR 1.0".
       DISPLAY "ENTER 1ST OPERATOR:".
       ACCEPT WSS-FIRSTOP.
       DISPLAY "ENTER 2ND OPERATOR".
       ACCEPT WSS-SECONDOP.
       DISPLAY "CHOOSE OPERATION TO PERFORM:".
       DISPLAY "A: ADD, S: SUBTRACT, M: MULTIPLY, D: DIVISION".
       ACCEPT WSS-OPERATOR.

   0003-OPERATIONS.
   OPERATIONS SECTION.
       IF WSS-OPERATOR =                   "A"
           ADD WSS-FIRSTOP TO WSS-SECONDOP GIVING WSS-RESULT
           DISPLAY "ADDITION RESULT: ",    WSS-RESULT
       ELSE IF WSS-OPERATOR =              "S"
           SUBTRACT WSS-FIRSTOP FROM WSS-SECONDOP GIVING WSS-RESULT
           DISPLAY "SUBTRACTING RESULT: ", WSS-RESULT
       ELSE IF WSS-OPERATOR =              "M"
           MULTIPLY WSS-FIRSTOP BY WSS-SECONDOP GIVING WSS-RESULT
           DISPLAY "MULTIPLYING RESULT: ", WSS-RESULT
       ELSE IF WSS-OPERATOR =              "D"
           DIVIDE WSS-SECONDOP INTO WSS-FIRSTOP GIVING WSS-RESULT
           DISPLAY "DIVIDING RESULT: ",    WSS-RESULT
       ELSE
           DISPLAY "INVALID OPERATOR. CHECK".

The calc enter in an infinite loop [...], is it a OpenCobolIDE problem or it's the code?

我认为两者都是。没有任何显示可能发生无限循环的主要原因很可能是 OCIDE 没有合适的终端。 运行 在进入循环之前,在单独的终端上应该至少导致显示 + 接受。如果我没记错的话,OCIDE 的首选项中有一些选项可以调整终端的行为方式。

代码"looks"像一个无限循环的原因是(如@bruce-martin提到的)段落和节的错误使用。如果要保留两者,则需要在段落结束时将部分 headers 放在段落之前,如果定义了新段落或定义了部分。

注意:节和段落的使用通常是 company-/team-defined:如果不是(就像在任何编程语言中一样)并且您编辑现有程序:使用旧代码所做的任何事情 - 对于新代码:随心所欲。 (我的 个人 偏好是只在我想 GOTO 时使用段落,并且总是使用 EXIT SECTION 来离开一个部分而不是 GOTO mysec-end )

解决可能的问题:使用文字 '1' 或数字 WSS-CHOICE PIC 9 [对于终端 i/o 我总是更喜欢字母数字 + 文字]。正如您所提到的,您是第一次查看 COBOL:一定要查看 EVALUATE WSS-OPERATOR.