У меня есть следующий код 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
Вы пропустили определение для этого 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
... но вы, вероятно, все равно захотите добавить проверки «сработало ли ОТКРЫТОЕ», но это другой вопрос, если вообще.
Есть лучший способ сделать это:
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, вы можете просто использовать нижний регистр.
Я избавился от EOF, как вы предложили. Спасибо