此 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
.
我是 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
.