【问题标题】:Infinite loop in cobol programcobol程序中的无限循环
【发布时间】:2015-01-20 12:06:46
【问题描述】:

我是旧 COBOL 的新手。我正在尝试在线编译器的示例。但是,我正在使用的代码正在进入一个无限循环。代码是:

IDENTIFICATION DIVISION.
PROGRAM-ID.  Conditions.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  Char               PIC X.
    88 Vowel           VALUE "a", "e", "i", "o", "u".
    88 Consonant       VALUE "b", "c", "d", "f", "g", "h"
                             "j" THRU "n", "p" THRU "t", "v" THRU "z".
    88 Digit           VALUE "0" THRU "9".
    88 ValidCharacter  VALUE "a" THRU "z", "0" THRU "9".

PROCEDURE DIVISION.
Begin.
    DISPLAY "Enter lower case character or digit. No data ends.".
    ACCEPT Char.
    PERFORM UNTIL NOT ValidCharacter
        EVALUATE TRUE
           WHEN Vowel DISPLAY "The letter " Char " is a vowel."
           WHEN Consonant DISPLAY "The letter " Char " is a consonant."
           WHEN Digit DISPLAY Char " is a digit."
           WHEN OTHER DISPLAY "problems found"
        END-EVALUATE
    END-PERFORM.
    STOP RUN.

我的理解(只是一个粗略的想法)是 PERFORM UNTIL 就像 whileEVALUATE 就像 SWITCHWHEN 类似于 C 中的 CASE。那么,输入有效字符时循环不应该中断吗?

【问题讨论】:

  • 循环在 NOT ValidCharacter 上中断。

标签: infinite-loop cobol


【解决方案1】:

您不会更改循环内的任何内容。循环中唯一的代码是一个EVALUATE(不更改数据)和四个DISPLAY 语句(不更改数据)。

什么都不改变的循环是一个无限循环。

您需要在END-EVALUATE 之后添加第二条ACCEPT 语句。

如果你用 C 编写了等价的代码,你也会得到一个无限循环。

【讨论】:

  • 换句话说,与在 C 中我们可以在 while 条件中编写 getchar() 调用(然后测试其值)不同,在 COBOL 中,ACCEPT 必须是它自己的语句。跨度>
  • @DavidGorsline 是的。这可能是正在尝试的,好镜头。
【解决方案2】:

正如比尔伍德格所说,你没有改变 char 的值,所以它会一直循环下去。

此外,如果你纠正了这个问题,程序仍然无法正常工作:你有一些奇怪的逻辑:

  • 它将PERFORM,而 Char 上有一个有效字符。
  • 但如果字符不是元音、辅音或数字,它将转义 EVALUATE

我最好的猜测是你尝试它的工作方式:

IDENTIFICATION DIVISION.
PROGRAM-ID.  Conditions.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  Char               PIC X.
    88 Vowel           VALUE "a", "e", "i", "o", "u".
    88 Consonant       VALUE "b", "c", "d", "f", "g", "h"
                             "j" THRU "n", "p" THRU "t", "v" THRU "z".
    88 Digit           VALUE "0" THRU "9".
    88 ValidCharacter  VALUE "a" THRU "z", "0" THRU "9".

PROCEDURE DIVISION.
Begin.
    DISPLAY "Enter lower case character or digit. No data ends.".
    MOVE "a" to Char
    PERFORM UNTIL NOT ValidCharacter
        ACCEPT Char
        EVALUATE TRUE
           WHEN Vowel DISPLAY "The letter " Char " is a vowel."
           WHEN Consonant DISPLAY "The letter " Char " is a consonant."
           WHEN Digit DISPLAY Char " is a digit."
        END-EVALUATE
    END-PERFORM.
    DISPLAY "Non-valid character!"
    STOP RUN.

变化:

  • 我将ACCEPT 放在PERFORM 中。
  • 因此,以及它的声明方式,Char 现在有一个无效字符(空格)。因此,我移动了一个有效字符(“a”)以使用MOVE "a" to Char 验证执行标准。
  • 我去掉了WHEN OTHER这一行,因为如果它真的是OTHER,这意味着它不是元音、辅音或数字,而这正是PERFORM正在做的事情:等到有一个无效字符中的字符。

我的输出:

Enter lower case character or digit. No data ends.
d
The letter d is a consonant.
e
The letter e is a vowel.
q
The letter q is a consonant.
a
The letter a is a vowel.
1
1 is a digit.
@
Non valid character!

COBOL STOP RUN at line 218 in program TEST.CBL

【讨论】:

  • 我不确定你在说什么。我建议在循环外使用“启动 ACCEPT”,第二个 ACCEPT 在循环底部。每次循环决定是否进入时,ACCEPT 中都会有一个新的当前值供代码操作。
  • 只有将 ACCEPT 放在循环的“顶部”才能使 OTHER 成为问题。
  • PERFORM WITH TEST AFTER 怎么样?那么你就不需要“prime” Char。
  • @ScottNelson 我喜欢启动,因为经常有其他事情要做(比如标题记录),可以在不使主要逻辑复杂化的情况下完成。读取,处理头部,读取,检查它是数据,或者如果尾部到达,文件是空的,只有当有东西时才进入数据处理。还改变了 PERFORM 的性质,它至少执行一次。没有代码就不能没有输入,因为这再次使主要数据逻辑混乱。
猜你喜欢
  • 2023-03-29
  • 2015-11-10
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2015-02-07
  • 1970-01-01
相关资源
最近更新 更多