【问题标题】:Weird COBOL error奇怪的 COBOL 错误
【发布时间】:2023-03-11 14:44:01
【问题描述】:

首先,这是完整的源代码: http://pastebin.com/5teGNrPC

*>
 IDENTIFICATION DIVISION.
 PROGRAM-ID.   CAddress.
 ENVIRONMENT    DIVISION.
 CONFIGURATION  SECTION.
 INPUT-OUTPUT SECTION.
 FILE-CONTROL.
           SELECT TelephoneBookFile
                   ASSIGN TO "phonebook.db"
                   ORGANIZATION IS INDEXED
                   RECORD KEY IS user-record-key
                   ACCESS MODE IS DYNAMIC.
 DATA DIVISION.
 FILE SECTION.
        FD TelephoneBookFile
                LABEL RECORDS ARE STANDARD.
        01 User-Record-File.
                05  user-record-key        PIC X(35).
                05  user-record-first-name PIC X(24).
        05  user-record-last-name  PIC X(50).
        05  user-record-address    PIC X(50).
        05  user-record-city       PIC X(16).
        05  user-record-zip        PIC X(8) .
        05  user-record-country    PIC X(20).
        05  user-record-telephone  PIC X(16).


 WORKING-STORAGE SECTION.
  77  menu-hoofd-invoer  PICTURE 9(1) VALUE 9.
        88  menu-invoer-correct  VALUE 0 THRU 5.
        88  menu-invoer-incorrect VALUE 6 THRU 9.
        88  menu-invoer-afsluiten VALUE 0.
        88  menu-invoer-record-toevoegen VALUE 1.
        88  menu-invoer-nieuw-bestand VALUE 5.
  77  Error-Msg  PICTURE X(30) VALUE "                              ".
  77  Green-Msg  PICTURE X(30) VALUE "                              ".
  77  file-status PICTURE X(3) VALUE " ".
        88  file-status-eof VALUE "EOF".
  01  User-Record.
        05  user-first-name PIC X(24).
        05  user-last-name  PIC X(50).
        05  user-address    PIC X(50).
        05  user-city       PIC X(16).
        05  user-zip        PIC X(8) .
        05  user-country    PIC X(20).
        05  user-telephone  PIC X(16).
  77  Yes-No-Correct-Field PICTURE X(1) VALUE " ".
        88  yes-no-field-yes   VALUE "Y" "y".
        88  yes-no-field-no    VALUE "N" "n".
        88  yes-no-field-correct VALUE "C" "c".
  77  Record-Count   PIC 9(5) VALUE 0.
  77  Error-Screen-Msg PIC X(45) VALUE SPACES.
  77  Navigate-Field PICTURE X(1) VALUE " ".
        88 Navigate-Next           VALUE "N" "n".
        88 Navigate-Prev           VALUE "P" "p".
        88 Navigate-Exit           VALUE "X" "x".
  77  Error-Continue-Flag PIC X(1) VALUE " ".
        88 Error-Continue-OK   VALUE "C" "c".
 SCREEN SECTION.
        01      MainMenu.
                05 BLANK SCREEN.
                05 LINE 1  COLUMN 1  VALUE " CAddress - A COBOL Address Book".
                05 LINE 2  COLUMN 1  VALUE " -------------------------------".
                05 LINE 4  COLUMN 1  VALUE "   Make your choice: ".
                05 LINE 5  COLUMN 1  VALUE "   ~~~~~~~~~~~~~~~~~ ".
                05 LINE 7  COLUMN 1  VALUE "       1) Add record".
                05 LINE 8  COLUMN 1  VALUE "       2) Delete record".
                05 LINE 9  COLUMN 1  VALUE "       3) Look up record".
                05 LINE 10 COLUMN 1  VALUE "       4) Show records".
                05 LINE 11 COLUMN 1  VALUE "       5) Create new file".
                05 LINE 13 COLUMN 1  VALUE "       0) Exit".
                05 LINE 15 COLUMN 1  VALUE "             Choice? ".
                05 LINE 15 COLUMN 25 PICTURE X(30) FROM Error-Msg FOREGROUND-COLOR 4.
                05 LINE 24 COLUMN 1  VALUE " (c) YvanSoftware ".
        01  InvoerMenu.
                05 BLANK SCREEN.
                05 LINE 1  COLUMN 1  VALUE " CAddress - A COBOL Address Book".
                05 LINE 2  COLUMN 1  VALUE " -------------------------------".
                05 LINE 4  COLUMN 1  VALUE "   Input Data".
                05 LINE 5  COLUMN 1  VALUE "   ~~~~~~~~~~".
                05 LINE 7  COLUMN 1  VALUE "   First name   :" FOREGROUND-COLOR 2.
                05 LINE 8  COLUMN 1  VALUE "   Last name    :" FOREGROUND-COLOR 2.
                05 LINE 9  COLUMN 1  VALUE "   Address      :" FOREGROUND-COLOR 2.
                05 LINE 10 COLUMN 1  VALUE "   City         :" FOREGROUND-COLOR 2.
                05 LINE 11 COLUMN 1  VALUE "   ZIP          :" FOREGROUND-COLOR 2.
                05 LINE 12 COLUMN 1  VALUE "   Country      :" FOREGROUND-COLOR 2.
                05 LINE 13 COLUMN 1  VALUE "   Telephone    :" FOREGROUND-COLOR 2.
                05 LINE 15 COLUMN 1  VALUE "       Save? y(es)/n(o)/c(orrect) " FOREGROUND-COLOR 4.
                05 LINE 24 COLUMN 1  VALUE " (c) YvanSoftware ".
        01  UitvoerScherm.
                05 BLANK SCREEN.
                05 LINE 1  COLUMN 1  VALUE " CAddress - A COBOL Address Book".
                05 LINE 2  COLUMN 1  VALUE " -------------------------------".
                05 LINE 4  COLUMN 1  VALUE "   Find Data".
                05 LINE 5  COLUMN 1  VALUE "   ~~~~~~~~~~".
                05 LINE 7  COLUMN 1  VALUE "   First name   :" FOREGROUND-COLOR 2.
                05 LINE 8  COLUMN 1  VALUE "   Last name    :" FOREGROUND-COLOR 2.
                05 LINE 9  COLUMN 1  VALUE "   Address      :" FOREGROUND-COLOR 2.
                05 LINE 10 COLUMN 1  VALUE "   City         :" FOREGROUND-COLOR 2.
                05 LINE 11 COLUMN 1  VALUE "   ZIP          :" FOREGROUND-COLOR 2.
                05 LINE 12 COLUMN 1  VALUE "   Country      :" FOREGROUND-COLOR 2.
                05 LINE 13 COLUMN 1  VALUE "   Telephone    :" FOREGROUND-COLOR 2.
* Col 45 Input
                05 LINE 15 COLUMN 1  VALUE "         Navigate? n(ext)/p(revious)/x(exit) " FOREGROUND-COLOR 4.
                05 LINE 24 COLUMN 1  VALUE " (c) YvanSoftware ".
        01  FoutScherm.
                05 BLANK SCREEN.
                05 LINE 4  COLUMN 15 VALUE "====================(ERROR)======================" BACKGROUND-COLOR 4 FOREGROUND-COLOR 7.
                05 LINE 5  COLUMN 15 VALUE "                                                 " BACKGROUND-COLOR 4 FOREGROUND-COLOR 7.
                05 LINE 6  COLUMN 15 VALUE "                                                 " BACKGROUND-COLOR 4 FOREGROUND-COLOR 7.
                05 LINE 7  COLUMN 15 VALUE "                                                 " BACKGROUND-COLOR 4 FOREGROUND-COLOR 7.
                05 LINE 8  COLUMN 15 VALUE "                                                 " BACKGROUND-COLOR 4 FOREGROUND-COLOR 7.
                05 LINE 10 COLUMN 15 VALUE "                INPUT C TO CONTINUE              " BACKGROUND-COLOR 4 FOREGROUND-COLOR 7.
                05 LINE 6  COLUMN 18 PICTURE X(45) FROM Error-screen-msg BACKGROUND-COLOR 4 FOREGROUND-COLOR 7 BLINK.
 PROCEDURE DIVISION.      
  main.
        PERFORM Show-MainMenu UNTIL menu-invoer-afsluiten.
        STOP RUN.
     .
  Show-MainMenu.
        DISPLAY MainMenu
        ACCEPT menu-hoofd-invoer LINE 15 COLUMN 22.
        IF menu-invoer-incorrect
        THEN
                MOVE " Incorrect input" TO Error-Msg
                MOVE " " TO Green-Msg
        END-IF.
        IF menu-invoer-record-toevoegen
        THEN
                PERFORM Show-InvoerMenu
        END-IF
        IF menu-invoer-nieuw-bestand
        THEN
                PERFORM Show-NewFile
        END-IF.
     .
  Show-InvoerMenu.
        DISPLAY InvoerMenu.
        ACCEPT user-first-name      LINE 7  COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-last-name       LINE 8  COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-address         LINE 9  COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-city            LINE 10 COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-zip             LINE 11 COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-country         LINE 12 COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-telephone       LINE 13 COLUMN 18
                WITH FOREGROUND-COLOR 4.

        PERFORM AskForSave.
  .
  Show-NewFile.
        DISPLAY InvoerMenu.
        ACCEPT user-first-name      LINE 7  COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-last-name       LINE 8  COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-address         LINE 9  COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-city            LINE 10 COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-zip             LINE 11 COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-country         LINE 12 COLUMN 18
                WITH FOREGROUND-COLOR 4.
        ACCEPT user-telephone       LINE 13 COLUMN 18
                WITH FOREGROUND-COLOR 4.

        PERFORM AskForSaveNew.

  AskForSave.  
        ACCEPT Yes-No-Correct-Field LINE 15 COLUMN 35
                WITH FOREGROUND-COLOR 2.

        IF Yes-No-Field-Correct
        THEN
                PERFORM Show-InvoerMenu
        END-IF.

        IF Yes-No-Field-No
        THEN
                PERFORM Show-MainMenu
        END-IF.

        IF Yes-No-Field-Yes
        THEN
                PERFORM Save-Record
        END-IF.

        IF NOT Yes-No-Field-No AND NOT Yes-No-Field-Yes AND NOT Yes-No-Field-Correct
        THEN
                PERFORM AskForSave
        END-IF.
        .
  Save-Record.
        OPEN I-O TelephoneBookFile.
        PERFORM AddRecordKey.
        MOVE user-first-name TO user-record-first-name.
        MOVE user-last-name  TO user-record-last-name .
        MOVE user-address    TO user-record-address   .
        MOVE user-city       TO user-record-city      .
        MOVE user-zip        TO user-record-zip       .
        MOVE user-country    TO user-record-country   .
        MOVE user-telephone  TO user-record-telephone .
        WRITE User-Record-File INVALID KEY PERFORM ExistsAlready.
        CLOSE TelephoneBookFile
        .
  AskForSaveNew.       
        ACCEPT Yes-No-Correct-Field LINE 15 COLUMN 35
                WITH FOREGROUND-COLOR 2.

        IF Yes-No-Field-Correct
        THEN
                PERFORM Show-NewFile
        END-IF.

        IF Yes-No-Field-No
        THEN
                PERFORM Show-MainMenu
        END-IF.

        IF Yes-No-Field-Yes
        THEN
                PERFORM Save-Record-NewFile
        END-IF.

        IF NOT Yes-No-Field-No AND NOT Yes-No-Field-Yes AND NOT Yes-No-Field-Correct
        THEN
                PERFORM AskForSave
        END-IF.
        .
  Save-Record-NewFile.
                OPEN OUTPUT TelephoneBookFile.
                PERFORM AddRecordKey.

        MOVE user-first-name TO user-record-first-name.
        MOVE user-last-name  TO user-record-last-name .
        MOVE user-address    TO user-record-address   .
        MOVE user-city       TO user-record-city      .
        MOVE user-zip        TO user-record-zip       .
        MOVE user-country    TO user-record-country   .
        MOVE user-telephone  TO user-record-telephone .
        WRITE User-Record-File.
        CLOSE TelephoneBookFile.
        .
  AddRecordKey.
        STRING user-first-name(1:5) user-last-name(1:5)
                   user-address(1:5) user-city(1:5)
                   user-zip(1:5) user-country(1:5)
                   user-telephone(1:5)
                DELIMITED BY SIZE
                INTO user-record-key
        .
  ExistsAlready.
        MOVE "Record already exists" TO Error-Screen-Msg
        PERFORM ErrorScreen
      .
  ErrorScreen.
        DISPLAY FoutScherm
        ACCEPT  Error-Continue-Flag LINE 24 COLUMN 80
        IF NOT Error-Continue-OK
        THEN
                Perform ErrorScreen
        END-IF.
        .  
 END PROGRAM CAddress.

我收到一个奇怪的 COBOL 错误,但我找不到它的含义。 它显示打开错误(请参阅以下 屏幕截图)。

如果我先使用“新文件”,然后添加记录,则不会发生。

这里是应用程序二进制文件和它生成的一些日志文件。

非常感谢,

伊万

PS:这是富士通 NetCobol 方言。

【问题讨论】:

    标签: cobol file-access netcobol


    【解决方案1】:

    也许程序会在文件创建之前尝试访问它。 'new file' 选项可能会使用 OPEN OUTPUT 语句创建数据文件,并且添加记录会成功。

    【讨论】:

    • 如果首先创建一个新文件,然后将一条记录添加到新文件中,它确实可以工作。但是,如果我退出应用程序并尝试重新打开文件并添加新记录,则会崩溃并显示上述消息。
    【解决方案2】:

    第一个错误可能是文件状态错误 35,打开一个不存在的文件。 你应该重构你的代码。在数据输入程序中,您只需要打开和关闭 语句每次执行一次。 在此程序中,OPEN 语句应尽可能靠近源代码的开头(在开头执行一次,以及为了可读性),CLOSE 应位于 STOP RUN 之前。

    【讨论】:

      【解决方案3】:

      我想了解更多有关您遇到的文件 I/O 问题的信息 有。如果我理解正确,您可以毫无问题地执行以下操作:

      • 创建新文件
      • 添加记录
      • 退出

      如果你再次启动程序并立即

      • 添加记录

      程序以“奇怪的错误”轰炸。

      你可以阅读吗 并显示您在初始运行中编写的记录?我想知道如果之前 写入成功,这反过来又对文件的完整性产生了质疑。

      我建议为SELECT 探索OPTIONAL 关键字和 也添加一个FILE STATUS 子句。应检查文件状态 在每次 I/O 操作(打开、关闭、写入、读取等)之后。包含的值 在与FILE STATUS 关联的变量中将带您走很长一段路 朝着解决问题的方向发展。以下table 描述FILE STATUS 值。

      您可能还想查看此tutorial 在 COBOL 中处理索引文件。

      我可能没有弄清楚您的文件 I/O 问题是什么,但我确实知道 以后肯定会惹麻烦的其他事情!

      您使用了以下构造:

      PERFORM Some-Paragraph
      ...
      Some-Paragraph.
      ...
      IF Some-Condition
         PERFORM Some-Paragraph
      END-IF
      .
      

      最后一个PERFORM Some-Paragraph在范围内 段落本身。 COBOL 编译器可能不会将此标记为错误,但 行为未定义。 COBOL PERFORM 不符合 到您可能熟悉的 CALL/RETURN 语义 其他语言。您在此处编码的内容通常称为 作为“逻辑炸弹”。我所指的内容的详细描述可以 找到here

      【讨论】:

      • 我可以读取并显示在初始运行中写入的记录,但如果我退出应用程序,数据已写入(我可以使用十六进制编辑器查看),但无法再读取。但我要重组程序,从头开始重写。谢谢您的帮助!伊万
      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 2014-10-11
      • 2012-04-27
      • 2013-10-30
      • 2016-09-18
      • 2012-03-18
      • 2015-05-13
      • 2016-07-14
      相关资源
      最近更新 更多