1

I'm trying to make a simple COBOL program that takes user inputs and writes them to a .txt file. My program successfully creates a .txt file, however, it fails to record any of the input, and for the life of me I can't figure out why. I want it to repeatedly take user input until specified not to and write that input to a text file. This is what I have:

      IDENTIFICATION DIVISION.
       PROGRAM-ID. LIFE4.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT OPTIONAL OUT-FILE ASSIGN "life.txt"
           ORGANIZATION LINE SEQUENTIAL.
       DATA DIVISION.
       FILE SECTION.
       FD OUT-FILE.
       01 F-EKRAN.
           02 F-TEXT PIC X(73).
           02 F-LINE PIC X(73).
           
       WORKING-STORAGE SECTION.
       01  E-WIDTH  CONSTANT 73.
       01  E-HEIGHT CONSTANT 31.
       01  E-SIZE   CONSTANT 300.
       01  Y-POS    PICTURE 99.
       01  X-POS    PICTURE 99.
       01  Y-TEMP   PICTURE 99.
       01  X-TEMP   PICTURE 99.
       01  TI       PICTURE 9(8).
       01  RND      PICTURE 9(8).
       01  E-TEMP   PICTURE X.
       01  E-COUNT  PICTURE 9.
       01  E-STEP   PICTURE 9(8).
       01  S-STEP   PICTURE +9(8).
       01  WS-TEMP  PICTURE X(E-WIDTH).
       01  EKRAN.
           02 E-LINE OCCURS E-HEIGHT.
           03 E-ITEM OCCURS E-WIDTH PICTURE X.
       01 I PIC S9.
       01 J PIC S9.
       PROCEDURE DIVISION.
       MAIN.
           OPEN OUTPUT OUT-FILE.
           ACCEPT TI FROM TIME.
           MOVE FUNCTION RANDOM(TI) TO RND.
           MOVE 0 TO E-STEP.
           MOVE 1 TO Y-POS.
           PERFORM INIT-EKRAN E-HEIGHT TIMES.
           PERFORM RANDOM-ITEM E-SIZE TIMES.
       LOOP.
           MOVE 1 TO Y-POS.
           MOVE E-STEP TO S-STEP.           
           DISPLAY FUNCTION CONCATENATE("STEP: ",  S-STEP).           
           PERFORM DRAW-EKRAN E-HEIGHT TIMES.
           
           MOVE 1 TO Y-POS.
           MOVE FUNCTION CONCATENATE("STEP: ",  S-STEP) TO F-TEXT.
           WRITE F-TEXT.
           PERFORM E-HEIGHT TIMES
             MOVE E-LINE(Y-POS) TO F-LINE
             WRITE F-LINE
             ADD 1 TO Y-POS
           END-PERFORM.
               
           PERFORM NEW-EKRAN.
           DISPLAY "CONTYNUE? (Y/N)".           
           ACCEPT E-TEMP.
           IF NOT ( E-TEMP = "N") MOVE "Y" TO E-TEMP.
           ADD 1 TO E-STEP.
           IF E-TEMP = "Y" GO TO LOOP.
           WRITE F-TEXT FROM "END".
           DISPLAY "END".
           CLOSE OUT-FILE.
           STOP RUN.

       INIT-EKRAN.
           MOVE 1 TO X-POS
           PERFORM E-WIDTH TIMES
              MOVE "-" TO E-ITEM(Y-POS,X-POS)
              ADD 1 TO X-POS
           END-PERFORM
           ADD 1 TO Y-POS
           .

       DRAW-EKRAN.
           DISPLAY E-LINE(Y-POS)                     
           ADD 1 TO Y-POS
           .

       RANDOM-ITEM.
           COMPUTE Y-POS = FUNCTION RANDOM() * E-HEIGHT + 1
           COMPUTE X-POS = FUNCTION RANDOM() * E-WIDTH + 1
           MOVE "X" TO E-ITEM(Y-POS,X-POS)
           .

       NEW-EKRAN.
           MOVE 1 TO Y-POS
           PERFORM E-HEIGHT TIMES
             MOVE 1 TO X-POS
             PERFORM E-WIDTH TIMES
              MOVE 0 TO E-COUNT
              MOVE -1 TO I
              PERFORM 3 TIMES
              MOVE -1 TO J
              PERFORM 3 TIMES
              IF NOT( I = 0 AND J = 0 )
                COMPUTE Y-TEMP = Y-POS + I
                COMPUTE X-TEMP = X-POS + J
                IF Y-TEMP > 0 AND Y-TEMP < E-HEIGHT + 1 AND 
                   X-TEMP > 0 AND X-TEMP < E-WIDTH + 1              
                   IF E-ITEM(Y-TEMP,X-TEMP) = "X" OR
                      E-ITEM(Y-TEMP,X-TEMP) = "D"
                      ADD 1 TO E-COUNT 
                   END-IF
                END-IF
              END-IF
              ADD 1 TO J
              END-PERFORM
              ADD 1 TO I
              END-PERFORM 

              IF E-ITEM(Y-POS,X-POS) = "-" AND E-COUNT = 3
                  MOVE "S" TO E-ITEM(Y-POS,X-POS) END-IF

              IF E-ITEM(Y-POS,X-POS) = "X" AND
                  ( E-COUNT < 2 OR E-COUNT > 3 )
                  MOVE "D" TO E-ITEM(Y-POS,X-POS) END-IF
       
               ADD 1 TO X-POS
             END-PERFORM
             ADD 1 TO Y-POS
           END-PERFORM
           
      *     DISPLAY " "
      *     DISPLAY " "
      *     PERFORM EKRAN-TEMP
      *     DISPLAY " "
      *     DISPLAY " "
           
           MOVE 1 TO Y-POS
           PERFORM E-HEIGHT TIMES
             MOVE 1 TO X-POS
             PERFORM E-WIDTH TIMES
               IF E-ITEM(Y-POS,X-POS) = "S"
                   MOVE "X" TO E-ITEM(Y-POS,X-POS) END-IF
               IF E-ITEM(Y-POS,X-POS) = "D"
                   MOVE "-" TO E-ITEM(Y-POS,X-POS) END-IF
               ADD 1 TO X-POS               
             END-PERFORM
             ADD 1 TO Y-POS
           END-PERFORM
           .
           
       EKRAN-TEMP.
           MOVE 1 TO Y-POS
           PERFORM DRAW-EKRAN E-HEIGHT TIMES           
           .
           
       END PROGRAM LIFE4.

When the program is executed, the file is created but it is empty. What is the problem?

  • As you've explicit noted GnuCOBOL: Did you compile and run with `cobc --debug` and get the same result? Did you try using a debugger ... or possibly compile with `-ftrace-all` and execute with `COB_SET_TRACE`=Y being set? [ideas how to improve your skills, if you find an idea: please answer your question and mark it a answer - which is perfectly fine for StackOverflow and gives two extra badges - please comment if you don't find the reason and I'm using likely the same to figure it out ... later] – Simon Sobisch Jan 10 '23 at 09:45

1 Answers1

0

Solution found.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. LIFE4.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT OPTIONAL OUT-FILE ASSIGN "life.txt"
       ORGANIZATION LINE SEQUENTIAL.
   DATA DIVISION.
   FILE SECTION.
   FD OUT-FILE.
   01 FLIN PIC X(73).           
       

   WORKING-STORAGE SECTION.
   01  E-WIDTH  CONSTANT 73.
   01  E-HEIGHT CONSTANT 31.
   01  E-SIZE   CONSTANT 300.
   01  Y-POS    PICTURE 99.
   01  X-POS    PICTURE 99.
   01  Y-TEMP   PICTURE 99.
   01  X-TEMP   PICTURE 99.
   01  TI       PICTURE 9(8).
   01  RND      PICTURE 9(8).
   01  E-TEMP   PICTURE X.
   01  E-COUNT  PICTURE 9.
   01  E-STEP   PICTURE 9(8).
   01  S-STEP   PICTURE +9(8).
   01  WS-TEMP  PICTURE X(E-WIDTH).
   01  EKRAN.
       02 E-LINE OCCURS E-HEIGHT.
       03 E-ITEM OCCURS E-WIDTH PICTURE X.
   01 I PIC S9.
   01 J PIC S9.
   PROCEDURE DIVISION.
   MAIN.
       OPEN OUTPUT OUT-FILE.
       ACCEPT TI FROM TIME.
       MOVE FUNCTION RANDOM(TI) TO RND.
       MOVE 0 TO E-STEP.
       MOVE 1 TO Y-POS.
       PERFORM INIT-EKRAN E-HEIGHT TIMES.
       PERFORM RANDOM-ITEM E-SIZE TIMES.
   LOOP.
       MOVE 1 TO Y-POS.
       MOVE E-STEP TO S-STEP.
       DISPLAY FUNCTION CONCATENATE("STEP: ",  S-STEP).
       PERFORM DRAW-EKRAN E-HEIGHT TIMES.

       MOVE 1 TO Y-POS.
       MOVE FUNCTION CONCATENATE("STEP: ",  S-STEP) TO FLIN.
       WRITE FLIN.
       PERFORM E-HEIGHT TIMES
         MOVE E-LINE(Y-POS) TO FLIN
         WRITE FLIN
         ADD 1 TO Y-POS
       END-PERFORM.

       PERFORM NEW-EKRAN.
       DISPLAY "CONTYNUE? (Y/N)".
       ACCEPT E-TEMP.
       IF NOT ( E-TEMP = "N") MOVE "Y" TO E-TEMP.
       ADD 1 TO E-STEP.
       IF E-TEMP = "Y" GO TO LOOP.
       MOVE "END" TO FLIN.
       WRITE FLIN.
       DISPLAY "END".
       CLOSE OUT-FILE.
       STOP RUN.

   INIT-EKRAN.
       MOVE 1 TO X-POS
       PERFORM E-WIDTH TIMES
          MOVE "-" TO E-ITEM(Y-POS,X-POS)
          ADD 1 TO X-POS
       END-PERFORM
       ADD 1 TO Y-POS
       .

   DRAW-EKRAN.
       DISPLAY E-LINE(Y-POS)
       ADD 1 TO Y-POS
       .

   RANDOM-ITEM.
       COMPUTE Y-POS = FUNCTION RANDOM() * E-HEIGHT + 1
       COMPUTE X-POS = FUNCTION RANDOM() * E-WIDTH + 1
       MOVE "X" TO E-ITEM(Y-POS,X-POS)
       .

   NEW-EKRAN.
       MOVE 1 TO Y-POS
       PERFORM E-HEIGHT TIMES
         MOVE 1 TO X-POS
         PERFORM E-WIDTH TIMES
          MOVE 0 TO E-COUNT
          MOVE -1 TO I
          PERFORM 3 TIMES
          MOVE -1 TO J
          PERFORM 3 TIMES
          IF NOT( I = 0 AND J = 0 )
            COMPUTE Y-TEMP = Y-POS + I
            COMPUTE X-TEMP = X-POS + J
            IF Y-TEMP > 0 AND Y-TEMP < E-HEIGHT + 1 AND
               X-TEMP > 0 AND X-TEMP < E-WIDTH + 1
               IF E-ITEM(Y-TEMP,X-TEMP) = "X" OR
                  E-ITEM(Y-TEMP,X-TEMP) = "D"
                  ADD 1 TO E-COUNT
               END-IF
            END-IF
          END-IF
          ADD 1 TO J
          END-PERFORM
          ADD 1 TO I
          END-PERFORM

          IF E-ITEM(Y-POS,X-POS) = "-" AND E-COUNT = 3
              MOVE "S" TO E-ITEM(Y-POS,X-POS) END-IF

          IF E-ITEM(Y-POS,X-POS) = "X" AND
              ( E-COUNT < 2 OR E-COUNT > 3 )
              MOVE "D" TO E-ITEM(Y-POS,X-POS) END-IF

           ADD 1 TO X-POS
         END-PERFORM
         ADD 1 TO Y-POS
       END-PERFORM

  *     DISPLAY " "
  *     DISPLAY " "
  *     PERFORM EKRAN-TEMP
  *     DISPLAY " "
  *     DISPLAY " "

       MOVE 1 TO Y-POS
       PERFORM E-HEIGHT TIMES
         MOVE 1 TO X-POS
         PERFORM E-WIDTH TIMES
           IF E-ITEM(Y-POS,X-POS) = "S"
               MOVE "X" TO E-ITEM(Y-POS,X-POS) END-IF
           IF E-ITEM(Y-POS,X-POS) = "D"
               MOVE "-" TO E-ITEM(Y-POS,X-POS) END-IF
           ADD 1 TO X-POS
         END-PERFORM
         ADD 1 TO Y-POS
       END-PERFORM
       .

   EKRAN-TEMP.
       MOVE 1 TO Y-POS
       PERFORM DRAW-EKRAN E-HEIGHT TIMES
       .

   END PROGRAM LIFE4.
  • 1
    Hm, can you please elaborate why this is the solution? Note: ` WRITE record-name FROM literal-or-data-item` should work fine. Please also specify what GnuCOBOL version you use. Unrelated to the question: you may consider using `PERFORM VARYING Y-POS FROM 1 BY 1 UNTIL Y-POS > E-HEIGHT`. – Simon Sobisch Jan 10 '23 at 14:10
  • changed FD OUT-FILE . 01 F-EKRAN . 02 F-TEXT PIC X (73). 02 F-LINE PIC X (73). on FD OUT-FILE . 01 FLIN PIC X (73). and earned. I use GnuCOBOL 2.0 – alexniklaus Jan 11 '23 at 03:36
  • Would you mind retesting with GC 3.2 (or 3.1.2)? GC 2.0 never got a final release and is heavily outdated. – Simon Sobisch Jan 11 '23 at 12:03