Область раздела связи имеет нулевой адрес

#null #cobol #gnucobol

Вопрос:

Я работаю над программой COBOL, и она вызывает внешний модуль для выполнения простого вычисления. Когда я запускаю программу, она выдает мне сообщение об ошибке, в котором говорится, что мой раздел ссылок имеет нулевой адрес, и я не знаю, почему

Вот снимок экрана с ошибкой Скриншот ошибки

Вот код для внешнего модуля

 IDENTIFICATION DIVISION.
   PROGRAM-ID. Program3Call.
   DATA DIVISION.
   LINKAGE SECTION.
   01 LS-STUDENT-AVERAGE-AREA.
       05 COURSE-AVERAGE-1 PIC 9(3).
       05 COURSE-AVERAGE-2 PIC 9(3).
       05 COURSE-AVERAGE-3 PIC 9(3).
       05 COURSE-AVERAGE-4 PIC 9(3).
       05 COURSE-AVERAGE-5 PIC 9(3).
       05 STUDENT-AVERAGE  PIC 9(3).

   PROCEDURE DIVISION .
   MAIN-PROCEDURE.
       100-STUDENT-AVERAGE.
             PERFORM 300-CALCULATE-AVERAGE-RTN.


       300-CALCULATE-AVERAGE-RTN.
       COMPUTE STUDENT-AVERAGE ROUNDED = (COURSE-AVERAGE-1  
           COURSE-AVERAGE-2   COURSE-AVERAGE-3   COURSE-AVERAGE-4  
           COURSE-AVERAGE-5) / 5.
   GOBACK.
 

Вот основная программа, в которой этот модуль называется:

        PROGRAM-ID. Project2 AS "Project2".

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
  *****The student input file
       SELECT STUDENT-FILE-IN
           ASSIGN TO "C:STUFILE.TXT"
           ORGANIZATION IS LINE SEQUENTIAL.

  *****The program input file
       SELECT PROGRAM-FILE-IN
           ASSIGN TO "C:PROGRAM.TXT"
           ORGANIZATION IS LINE SEQUENTIAL.

  *****The student report output file
       SELECT STUDENT-REPORT-FILE-OUT
           ASSIGN TO "C:REPORT.TXT"
           ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.
  *Student input file
   FD STUDENT-FILE-IN.
   01 STUDENT-RECORD.
       05 STUDENT-NUMBER   PIC 9(6).
       05 TUITION-OWED-IN  PIC 9(4)V99.
       05 STUDENT-NAME-IN  PIC X(40).
       05 PROGRAM-OF-STUDY PIC X(5).
       05 COURSE-CODE-1    PIC X(7).
       05 COURSE-AVERAGE-1 PIC 9(3).
       05 COURSE-CODE-2    PIC X(7).
       05 COURSE-AVERAGE-2 PIC 9(3).
       05 COURSE-CODE-3    PIC X(7).
       05 COURSE-AVERAGE-3 PIC 9(3).
       05 COURSE-CODE-4    PIC X(7).
       05 COURSE-AVERAGE-4 PIC 9(3).
       05 COURSE-CODE-5    PIC X(7).
       05 COURSE-AVERAGE-5 PIC 9(3).

  *Program input file
   FD PROGRAM-FILE-IN.
   01 PROGRAM-RECORD-IN.
       05 PROGRAM-CODE-IN PIC X(5).
       05 PROGRAM-NAME-IN PIC X(20).

  *Student report output file
   FD STUDENT-REPORT-FILE-OUT.
   01 STUDENT-REPORT-RECORD-OUT PIC x(90).



   WORKING-STORAGE SECTION.
  *Table to hold program records
   01 PROGRAM-RECORD.
       05 PROGRAM-TABLE.
           10 PROGRAM-CODE PIC X(5)  OCCURS 20 TIMES.
           10 PROGRAM-NAME PIC X(20) OCCURS 20 TIMES.

  *The student report record
   01 STUDENT-REPORT-RECORD.
       05 STUDENT-NAME     PIC X(40).
       05 FILLER           PIC X(2) VALUE SPACES.
       05 PROGRAM-NAME-OUT PIC X(20).
       05 FILLER           PIC X(4) VALUE SPACES.
       05 TUITION-OWED     PIC Z,ZZ9.99.

  *A line to make the output look good
   01 HEADER-LINE.
       05 FILLER PIC X(90) VALUE ALL "-".

  *The column header
   01 COLUMN-HEADER.
       05 NAME-COLUMN PIC X(42) VALUE "NAME".
       05 AVG-COLUMN  PIC X(7)  VALUE "AVE".
       05 PROG-COLUMN PIC X(24) VALUE "PROGRAM NAME".
       05 OWED-COLUMN PIC X(12) VALUE "TUITION OWED".

   01 CONTROL-FIELDS.
       05 STUFILE-EOF-FLAG  PIC A(3).
       05 PROG-EOF-FLAG     PIC A(3).
       05 PROG-SUB          PIC 9(2).
       05 FOUND-PROG-FLAG   PIC A(3).

   01 COUNTERS.
       05 STUDENT-RECORDS-READ-CTR    PIC 9(3).
       05 STUDENT-REPORTS-WRITTEN-CTR PIC 9(3).

   01 WW-SEND-AREA.
       05 STUDENT-AVERAGE  PIC 9(3).

   01 WW-SUB-PROG PIC X(75)
       VALUE 'C:UsersDesireebinProgram3Call'.

   PROCEDURE DIVISION.
   PERFORM 200-INITIALIZATION-RTN.
  *Read and process all student records
   PERFORM 200-PROCESS-STUDENT-RECORD-RTN
       UNTIL STUFILE-EOF-FLAG = "YES".
   PERFORM 200-FINISH-RTN.
   STOP RUN.

   200-INITIALIZATION-RTN.
       PERFORM 300-OPEN-FILES-RTN.
  *****Load all program records into the table
       PERFORM 300-LOAD-PROGRAM-TABLE-RTN
           VARYING PROG-SUB FROM 1 BY 1
           UNTIL PROG-SUB > 20 OR PROG-EOF-FLAG = "YES".
       PERFORM 300-INITIALIZE-REPORT-FILE-RTN.
       PERFORM 300-INITIALIZE-COUNTERS-RTN.

   200-PROCESS-STUDENT-RECORD-RTN.
       PERFORM 300-READ-STUDENT-RECORD-RTN.
       IF STUFILE-EOF-FLAG NOT EQUALS "YES"
  *********Get the program name
           PERFORM 300-GET-PROGRAM-NAME-RTN
               VARYING PROG-SUB FROM 1 BY 1 UNTIL
               FOUND-PROG-FLAG = "YES" OR PROG-SUB > 20
           PERFORM 300-GET-STUDENT-AVERAGE
           PERFORM 300-PRINT-STUDENT-REPORT-RTN
       END-IF.

   200-FINISH-RTN.
       PERFORM 300-PRINT-COUNTERS-RTN.
       PERFORM 300-CLOSE-FILES-RTN.

   300-OPEN-FILES-RTN.
       OPEN INPUT STUDENT-FILE-IN.
       OPEN INPUT PROGRAM-FILE-IN.
       OPEN OUTPUT STUDENT-REPORT-FILE-OUT.

   300-LOAD-PROGRAM-TABLE-RTN.
       READ PROGRAM-FILE-IN
       AT END MOVE "YES" TO PROG-EOF-FLAG
       NOT AT END MOVE PROGRAM-CODE-IN TO PROGRAM-CODE (PROG-SUB)
                  MOVE PROGRAM-NAME-IN TO PROGRAM-NAME (PROG-SUB).

   300-INITIALIZE-REPORT-FILE-RTN.
       MOVE COLUMN-HEADER TO STUDENT-REPORT-RECORD-OUT.
       WRITE STUDENT-REPORT-RECORD-OUT.
       MOVE HEADER-LINE TO STUDENT-REPORT-RECORD-OUT.
       WRITE STUDENT-REPORT-RECORD-OUT.

   300-INITIALIZE-COUNTERS-RTN.
       MOVE 0 TO STUDENT-RECORDS-READ-CTR.
       MOVE 0 TO STUDENT-REPORTS-WRITTEN-CTR.

   300-READ-STUDENT-RECORD-RTN.
       READ STUDENT-FILE-IN
           AT END MOVE "YES" TO STUFILE-EOF-FLAG
           NOT AT END ADD 1 TO STUDENT-RECORDS-READ-CTR.

   300-GET-PROGRAM-NAME-RTN.
       IF PROGRAM-CODE (PROG-SUB) = PROGRAM-OF-STUDY
           MOVE PROGRAM-NAME (PROG-SUB) TO PROGRAM-NAME-OUT
           MOVE "YES" TO FOUND-PROG-FLAG
       END-IF.

   300-GET-STUDENT-AVERAGE.
        CALL WW-SUB-PROG USING WW-SEND-AREA.

   300-PRINT-STUDENT-REPORT-RTN.
       MOVE "NO" TO FOUND-PROG-FLAG.
       MOVE STUDENT-NAME-IN TO STUDENT-NAME.
       MOVE TUITION-OWED-IN TO TUITION-OWED.
       MOVE STUDENT-REPORT-RECORD TO STUDENT-REPORT-RECORD-OUT.
       WRITE STUDENT-REPORT-RECORD-OUT.
       ADD 1 TO STUDENT-REPORTS-WRITTEN-CTR.

   300-PRINT-COUNTERS-RTN.
       DISPLAY "Student records read: ", STUDENT-RECORDS-READ-CTR.
       DISPLAY "Student reports written: ",
           STUDENT-REPORTS-WRITTEN-CTR.

   300-CLOSE-FILES-RTN.
       CLOSE STUDENT-FILE-IN, PROGRAM-FILE-IN
           STUDENT-REPORT-FILE-OUT.


   END PROGRAM Project2.
 

Ответ №1:

Я думаю, вам нужно написать код Procedure Division USING LS-STUDENT-AVERAGE-AREA. в Program3Call.

Комментарии:

1. Это первое, что нужно сделать. Но также обратите внимание, что WW-SEND-AREA это не соответствует LS-STUDENT-AVERAGE-AREA , что приводит к большему количеству проблем в будущем.

2. @piet. t У вызывающего абонента также отсутствует Подразделение идентификации. Мы делаем все, что в наших силах.