GnuCobol 'EOF' не определен

У меня есть следующий код Gnu Cobol:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. INCOME-TAX-CALCULATOR.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
       SELECT EMPLOYEE-FILE
           ASSIGN TO "employees.csv"
           ORGANIZATION IS LINE SEQUENTIAL.

   DATA DIVISION.
   FILE SECTION.
   FD  EMPLOYEE-FILE.
   01  EMPLOYEE-RECORD.
       02  EMP-ID              PIC 9(5).
       02  EMP-NAME            PIC X(30).
       02  EMP-SALARY          PIC 9(7).
       02  EMP-TAX             PIC 9(5).

   WORKING-STORAGE SECTION.
   01  WS-TAX-RATE           PIC 9(4)V99 VALUE 20.

   PROCEDURE DIVISION.
   OPEN INPUT EMPLOYEE-FILE
   PERFORM UNTIL EOF
       READ EMPLOYEE-FILE
           AT END SET EOF TO TRUE
       END-READ
       COMPUTE EMP-TAX = EMP-SALARY * WS-TAX-RATE
       DISPLAY EMP-ID, EMP-NAME, EMP-SALARY, EMP-TAX
   END-PERFORM
   CLOSE EMPLOYEE-FILE
   STOP RUN.

в GnuCobol 3.1.2.0 я получаю следующую ошибку: programName:25: error: 'EOF' is not defined

Я видел подобные вопросы, но END PROGRAM не помогает.

Я использую компилятор с бесплатным форматом следующим образом: cobc -x -F -o programName programName.cbl

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы пропустили определение для этого EOF, поэтому оно... не определено.

добавление определения, подобного следующему в WORKING-STORAGE-SECTION, решит эту проблему:

   01  FILLER PIC X VALUE ' '.
       88  EOF VALUE 'E'.

но вы, скорее всего, определите "NOT-EOF" или что-то подобное и установите его перед этим циклом или, что еще лучше, полностью от него избавитесь:

   PERFORM UNTIL EXIT
       READ EMPLOYEE-FILE
           AT END EXIT PERFORM
       END-READ
       COMPUTE EMP-TAX = EMP-SALARY * WS-TAX-RATE
       DISPLAY EMP-ID, EMP-NAME, EMP-SALARY, EMP-TAX
   END-PERFORM

... но вы, вероятно, все равно захотите добавить проверки «сработало ли ОТКРЫТОЕ», но это другой вопрос, если вообще.

Я избавился от EOF, как вы предложили. Спасибо

Juanjo 07.01.2023 01:47

Есть лучший способ сделать это:

perform until exit
    read employee-file
        at end 
            exit perform
        not at end
            COMPUTE EMP-TAX = EMP-SALARY * WS-TAX-RATE
            DISPLAY EMP-ID, EMP-NAME, EMP-SALARY, EMP-TAX
   end-read
end-perform
            

Я всегда так читаю, флаг EOF не нужен. Еще лучше, разбейте не в конце материал на абзац и выполните это:

perform until exit
    read employee-file
        at end 
            exit perform
        not at end
            perform compute-and-display
   end-read
end-perform
close employee-file
goback
.

compute-and-display.
    COMPUTE EMP-TAX = EMP-SALARY * WS-TAX-RATE
    DISPLAY EMP-ID, EMP-NAME, EMP-SALARY, EMP-TAX
    exit paragraph
.

Выходной абзац не нужен, но мне нравится использовать его, чтобы прояснить мое намерение, что это явное «возврат». Кроме того, если вы используете GnuCobol, вы можете просто использовать нижний регистр.

Другие вопросы по теме