2017-04-23 102 views
0

我目前正在编写一个COBOL程序,其中包含一个屏幕,用于检查和显示文件中的记录。但是,当我尝试输入“F”或“Q”以外的命令时,程序会一直卡住。虽然它是假设与我试图调用错误message.The错误消息,以显示新的屏幕是“<>”COBOL程序将不会结束

Identification Division. 
    Program-ID.  Lab10b. 

    Environment Division. 
    Input-Output Section. 
    File-Control. 
     Select InFile Assign to "Lab10b-master.dat" 
     Organization is Indexed 
     Access Mode is Random 
     Record Key is Movie-Key 
     Status is FileStatus. 

    Data Division. 
    File Section. 
    FD InFile. 
    01 Movie. 
     05 Movie-Key  Pic 9(5). 
     05 Movie-Title  Pic X(50). 
     05 Movie-Genre  Pic X(20). 

    Working-Storage Section. 
    01 black constant as 0. 
    01 blue constant as 1. 
    01 green constant as 2. 
    01 cyan constant as 3. 
    01 red  constant as 4. 
    01 magenta constant as 5. 
    01 brown constant as 6. 
    01 white constant as 7. 
    01 Today-Date. 
     05 YYYY    Pic 9(4). 
     05 MM     Pic 9(2). 
     05 DD     Pic 9(2). 
    01 FileStatus    Pic 99. 
    01 Error-Message   Pic X(50). 
    01 Res1. 
     05 a     Pic X. 
     05 b     Pic X. 
     05 c     Pic X. 
     05 d     Pic X. 
     05 e     Pic X. 
    01 Res2     Pic X. 
     88 Quit  Value "Q" "q". 
     88 Find  Value "F" "f". 

    Screen Section. 
    01 data-screen. 
     05 screen-header. 
      10 PH-Month Blank Screen Line 01 Col 01 Pic Z9/ From MM. 
      10 PH-Day Line 01 Col 04 Pic 99/ From DD. 
      10 PH-Year Line 01 Col 07 Pic 9999 From YYYY. 
      10 Value "Stomper & Wombat's Movie Warehouse" 
      Line 01 Col 40. 
     05 screen-data. 
      10 Value "Movie #:  " Line 05 Col 9. 
      10 Movie-Number-Out Line 05 Col 24 
      Pic 9(5) from Movie-Key Blank When Zero. 
      10 Value "Title:   " Line 06 Col 9. 
      10 Movie-Title-Out Line 06 Col 24 
      Pic X(50) From Movie-Title. 
      10 Value "Genre:   " Line 07 Col 9. 
      10 Movie-Genre-Out Line 07 Col 24 
      Pic X(50) From Movie-Genre. 
     05 Error-Message-Out Line 11 Col 15 Pic X(50) 
      From Error-Message foreground-color red. 
     05 screen-response. 
      10 Value "Key:   [" Line 13 Col 9. 
      10 Key-Response Line 13 Col 25 Pic X(5) to Res1. 
      10 Value "]" Line 13 Col 30. 
     05 screen-response2. 
      10 Value "Command:  [" Line 14 Col 9. 
      10 Command-response Line 14 Col 25 Pic X to Res2. 
      10 Value "]" Line 14 Col 26. 


    Procedure Division. 
    000-Main. 
     Accept Today-Date From Date YYYYMMDD 
     Move YYYY To PH-Year 
     Move MM To PH-Month 
     Move DD To PH-Day 

     Open Input InFile 
     Move " " to Error-Message 
     Display data-screen 
     Accept screen-response2 
     If Res2 = "F" Or "f" 
      Accept screen-response 
     End-If 

     Perform Until res2 = "q" or "Q" 
      Move " " to Error-Message 
      If res2 <> "Q" And "q" and "f" and "F" *> If Command Response is not valid, Write this error message. 
      Move "<<Command Invalid>>" to Error-Message 
      Else if res2 = "f" Or "F" *> If command = find 
      If a = " " And b = " " And c = " " And d = " " 
      And e = " " *> Check if key is empty 
       Move "<<Key Must Be Provided>>" to Error-Message 
       Move " " to Movie 
      Else If (a = " " Or b = " " Or c = " " Or d = " " 
      Or e = " ") Or res1 is not numeric *> Check if key is numeric and complete? 
       Move "<<Invalid Key>>" to Error-Message 
       Move " " to Movie 
      Else 
       Move res1 to Movie-Key 
       Read InFile 
       Evaluate FileStatus 
        When 00 
         Continue 
        When 23 
         Move " " to Movie 
         Move "<<Key Not Found>>" to Error-Message 
        When Other 
         Move "<<Unknown Read Error>>" to Error-Message 
       End-Evaluate 
      End-If 
      Else 
      Continue 
      End-If 

      Display data-screen 
      Accept screen-response2 
      If Res2 = "F" Or "f" 
      Accept screen-response 
      End-If 
     End-Perform 

     Close InFile 
     Stop Run. 
+3

在您的PERFORM中,您有四个IF和三个END-IF。你的代码不会像你想象的那样执行。 –

+2

如果代码行为“奇怪”:用'-Wall'重新编译,如果这没有显示任何重要的用'-W'重新编译。取决于'cobc'的版本,您可以使用其中的一个向您显示“IF语句未被END-IF终止”2次。 –

+1

@SimonSobisch是的,我错过了最后一个:-) –

回答

1

也许这可能是更容易阅读和调试:

01 Perform Until res2 = "q" or "Q" 
02  Move " " to Error-Message 
03  If res2 <> "Q" And "q" and "f" and "F" 
04   Move "<<Command Invalid>>"     to Error-Message 
05  Else 
06   if res2 = "f" Or "F" 
07   If a = " " And b = " " And c = " " And d = " " And 
08    e = " " *> Check if key is empty 
09    Move "<<Key Must Be Provided>>"  to Error-Message 
10    Move " "        to Movie 
11   Else 
12    If (a = " " Or b = " " Or c = " " Or d = " " 
13     Or e = " ") Or res1 is not numeric 
14     Move "<<Invalid Key>>"   to Error-Message 
15     Move " "       to Movie 
16    Else 
17     Move res1       to Movie-Key 
18     Read InFile 
19     Evaluate FileStatus 
20     When 00 
21      Continue 
22     When 23 
23      Move " "      to Movie 
24      Move "<<Key Not Found>>"  to Error-Message 
25     When Other 
26      Move "<<Unknown Read Error>>" to Error-Message 
27     End-Evaluate 
28    End-If 
29   Else 
30   Continue 
31   End-If 
32 
33  Display data-screen 
34  Accept screen-response2 
35  If Res2 = "F" Or "f" 
36   Accept screen-response 
37  End-If 
38 End-Perform 

(为了便于参考,我添加了行号。)

以下是发生了什么:您错过了结尾 - 如果在某处。

您可能会在第28行之后丢失一个,但这不是问题所在。因为你已经有了一个else(在第11行)的if第7行中,else将从第7行终止if,并适用于一个第6行

我相信你错过了另一个end-if行后31.目前发生的情况是,如果您输入的东西不是QF,它在第4行上执行move,然后跳过第5行上的else和终止if时的所有内容。因为你行31后缺少end-if,它会跳过一切,直到end-perform上线38

小澄清:如果你进入其他的东西比QF IT进入一个无限循环的原因是它跳过第34行的accept,因此你没有机会输入其他任何东西。而且因为你的表演一直持续到res2 = "q" or "Q",这显然不是,它会一直保持循环。

这就是为什么正确的缩进非常必要。一旦我缩小了一切,显然问题是什么。对于你来说,只要按照某种方式输入东西可能没什么问题,但如果其他人必须稍后再来,并且对此进行处理,那么你会很快使他们憎恨你。如果它整洁清晰,他们会爱上你的。

另外,我注意到你有定义88个水平退出查找但你不使用它们。他们会让你的代码更具可读性。并与a = " "等上线7 & 8的测试可以通过使用if res1 = spaces简化(假设OpenCOBOL工作应该的方式。我没有用它)

希望这有助于。