【问题标题】:Perform until loop in COBOL only reads once, then breaks out despite the condition still being false执行直到 COBOL 中的循环仅读取一次,然后尽管条件仍然为假,但仍会中断
【发布时间】:2018-08-15 21:51:37
【问题描述】:

对于 COBOL 来说还是很陌生。我有一个简单的程序可以运行以读取文件,然后读取该文件的内容并将其格式化为另一个文件。我的主要问题实际上在于,由于某种原因,我的模块会测试条件,看到它是假的,然后执行里面的语句。之后,它将在不改变条件的情况下重复该过程,然后终止程序。根据调试器,它甚至没有运行最终模块 200-TERM-RECORD,它就结束了。

这是程序的代码

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL 
       SELECT INVENT-FILE-IN
           ASSIGN TO "C:\TEST.TXT"
               ORGANIZATION IS LINE SEQUENTIAL.
       SELECT INVENT-REPORT-OUT
           ASSIGN TO "C:\INVREPT.TXT"
               ORGANIZATION IS LINE SEQUENTIAL. 

   data division.
   FILE SECTION. 
   FD INVENT-FILE-IN
       RECORD CONTAINS 32 CHARACTERS.
   01 INVENTORY-DATA-INPUT
       05 PART-NUMBER-INPUT PIC 9(5)
       05 PART-NAME-INPUT PIC X(20)
       05 QUANTITY-ON-HAND-INPUT PIC 9(3)
       05 UNIT-PRICE-INPUT PIC 9(4)

   FD INVENT-REPORT-OUT
       RECORD CONTAINS 77 CHARACTERS.
   01 INVENTORY-DATA-OUTPUT
       05 HEADER
           10 PRODUCT-NUMBER PIC A(6)
           10 FILLER PIC A(1)
           10 PRODUCT-NAME PIC A(8)
           10 FILLER PIC A(16)
           10 PRODUCT-QTY PIC A(3)
           10 FILLER PIC A(3)
           10 PRODUCT-VALUE PIC A(5)
           10 FILLER PIC A(3)
       05 PART-NUMBER-OUTPUT PIC 9(5)
       05 PART-NAME-OUTPUT PIC X(20)
       05 QUANTITY-ON-HAND-OUTPUT PIC 9(3)
       05 UNIT-PRICE-OUTPUT PIC 9(4)
       05 SUPPLIER-CODE-OUTPUT PIC X(5)
       05 RE-ORDER-POINT-OUTPUT PIC 9(3)
       05 RECORD-COUNTER-OUTPUT PIC 9(2)
   working-storage section.
   01 VALUES-AND-TOTALS
       05 EOF-SWITCH PIC X(1) VALUE "N"
       05 TOTAL-VALUE PIC 9(6) VALUE ZERO
       05 INVENTORY-VALUE PIC 9(6) VALUE ZERO 
       05 RECORD-COUNTER PIC 9(2) VALUE ZERO

   procedure division.
   100-CREATE-INVENTORY-RECORD.
       PERFORM 200-INIT-CREATE-INV-RECORD.
       PERFORM 200-CREATE-RECORD 
           UNTIL EOF-SWITCH = "Y".
       PERFORM 200-TERM-RECORD.



   200-INIT-CREATE-INV-RECORD.
       PERFORM 700-OPEN-INV-FILE.
       PERFORM 700-READ-FILE.

   200-CREATE-RECORD.
       PERFORM 700-WRITE-RECORD.
       PERFORM 700-READ-FILE.


   200-TERM-RECORD.
       CLOSE INVENT-FILE-IN.
       CLOSE INVENT-REPORT-OUT.

   700-OPEN-INV-FILE.
       OPEN INPUT INVENT-FILE-IN.
       OPEN OUTPUT INVENT-REPORT-OUT.

   700-READ-FILE.
       READ INVENT-FILE-IN
       AT END MOVE "Y" TO EOF-SWITCH.


   700-WRITE-RECORD.
       MOVE PART-NUMBER-INPUT TO PART-NUMBER-OUTPUT.
       MOVE PART-NAME-INPUT TO PART-NAME-OUTPUT.
       MOVE QUANTITY-ON-HAND-INPUT TO QUANTITY-ON-HAND-OUTPUT.
       MOVE UNIT-PRICE-INPUT TO UNIT-PRICE-OUTPUT.
       WRITE INVENTORY-DATA-OUTPUT.

       goback.

   end program Project2.

【问题讨论】:

    标签: loops debugging cobol terminate


    【解决方案1】:

    您的代码流程(从 100-create on 开始)是:

    • 200 初始化
      • 700-打开
      • 700-read
    • 200-创建
      • 700 次写入 -> 回退

    不涉及循环...

    一般

    我建议使用 SECTION 并且只在您的主 SECTION 或 prog-end SECTION 中使用 GOBACK,这是从您的主调用的(并且也可能在特殊情况下调用) )。

    【讨论】:

      【解决方案2】:

      goback语句从程序末尾移到第一段末尾。

      700-WRITE-RECORD 中,当控制到达goback 语句时,程序终止。您可能希望程序在 100-CREATE-INVENTORY-RECORD 结尾处终止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-11
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多