使用,MicrosoftCOBOLCompilerVersion2.2,和我的代码完全可以正常工作。
IDENTIFICATION DIVISION.
PROGRAM-ID. COCENTRY.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT COC-FILE
ASSIGN TO DISK
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS COCNO
FILE STATUS IS FILE-STATUS.
DATA DIVISION.
FILE SECTION.
FD COC-FILE LABEL RECORD IS STANDARD
VALUE OF FILE-ID IS "COC.DAT".
01 COC-RECORD.
03 COCNO PIC 9(5).
03 COCDESC PIC X(40).
WORKING-STORAGE SECTION.
01 FILE-STATUS PIC XX.
01 ESC-CODE PIC 99 VALUE 0.
88 ESC-KEY VALUE 1.
88 F2 VALUE 3.
88 F10 VALUE 11.
01 ERRMSG PIC X(70) VALUE SPACES.
01 ERR PIC 9 VALUE 0.
SCREEN SECTION.
01 FORM1.
03 BLANK SCREEN BACKGROUND-COLOR 1.
03 LINE 1 COLUMN 1 'COCNO'.
03 LINE 2 COLUMN 1 'COCDESC'.
03 LINE 24 COLUMN 1 "Esc=Exit F2=Save F10=Cancel".
03 LINE 25 COLUMN 1 PIC X(70) FROM ERRMSG HIGHLIGHT.
01 FORM2.
03 LINE 1 COLUMN 14 PIC 9(5)
USING COCNO REVERSE-VIDEO.
03 LINE 2 COLUMN 14 PIC X(40)
USING COCDESC REVERSE-VIDEO.
03 LINE 24 COLUMN 1 PIC 99
USING ESC-CODE.
PROCEDURE DIVISION.
MAIN.
OPEN I-O COC-FILE.
IF FILE-STATUS NOT = '00'
OPEN OUTPUT COC-FILE
CLOSE COC-FILE
OPEN I-O COC-FILE.
PERFORM ENTRY1 THRU ENTRYX UNTIL ESC-KEY.
CLOSE COC-FILE.
STOP RUN.
ENTRY1.
MOVE SPACES TO COC-RECORD.
MOVE ZEROES TO COCNO.
ENTRY2.
DISPLAY FORM1 FORM2.
ACCEPT FORM2.
ACCEPT ESC-CODE FROM ESCAPE KEY.
IF F10
MOVE 'Entries canceled...' TO ERRMSG
GO ENTRY1
ELSE IF F2
GO ENTRY3
ELSE IF ESC-KEY
GO ENTRYX
ELSE
GO ENTRY2.
ENTRY3.
MOVE 0 TO ERR.
WRITE COC-RECORD INVALID KEY MOVE 1 TO ERR.
IF ERR = 1
MOVE 'Duplicate key not allowed...' TO ERRMSG
GO ENTRY2
ELSE
MOVE 'Entries recorded...' TO ERRMSG
GO ENTRY1.
ENTRYX.
EXIT.现在,我使用的是OpenCobol IDE 4.3.0,它的GNUCobol版本为1.1.0,提示我使用以下行
syntax error, unexpected "Literal", expecting LEADING or TRAILING
03 LINE 1 COLUMN 1 'COCNO'.
03 LINE 2 COLUMN 1 'COCDESC'.
03 LINE 24 COLUMN 1 "Esc=Exit F2=Save F10=Cancel".因此,我通过添加值关键字来修复它们:
03 LINE 1 COLUMN 1 VALUE 'COCNO'.
03 LINE 2 COLUMN 1 VALUE 'COCDESC'.
03 LINE 24 COLUMN 1 VALUE "Esc=Exit F2=Save F10=Cancel".但一旦我做了这件事,我就会得到另一个提示
'ACCEPT .. FROM ESCAPE KEY' not implemented
这条线上
ACCEPT ESC-CODE FROM ESCAPE KEY.
这可能是什么原因?解决这个问题的办法是什么?
发布于 2015-02-16 00:58:24
您的实际答案在这里,https://sourceforge.net/p/open-cobol/discussion/help/thread/26a01c5f/,在SourceForge的GnuCOBOL部分。只要稍加改动,您的代码就会“完全”使用您已经完成的包含VALUE子句的更改,如果您使用的是GnuCOBOL编译器的2.0版或更高版本。
您的代码可能“完全工作”,但它是意大利面代码。
这个词来源于过去,涉及到在程序中使用许多分支,这是当时的一种常见做法,但它使试图遵循逻辑的过程就像试图遵循一串煮熟的意大利面一样,这是一堆煮熟的意大利面的一部分。
如果您改变了这一点:
PERFORM ENTRY1 THRU ENTRYX UNTIL ESC-KEY.对此:
PERFORM ENTRY1 THRU ENTRYX.你的程序还能用。迷惑了?是的,因为你有意大利面。您的程序流只会到达ENTRYX一次。当它到达ENTRYX时,它的值是ESC-键,但这是多余的,因为它只能到达一次,当它是ESC-键时。明白了吗?不是吗?因为你有意大利面。
这是你的逻辑,重写:
PROCEDURE DIVISION.
OPEN I-O COC-FILE
IF FILE-STATUS NOT = '00'
[the following code is a horror. Deal with this outside the
program. Crash for an unexpected FILE STATUS on OPEN]
OPEN OUTPUT COC-FILE
CLOSE COC-FILE
OPEN I-O COC-FILE
END-IF
PERFORM PROCESS-USER-INPUT
UNTIL ESC-KEY
CLOSE COC-FILE
IF FILE-STATUS NOT = '00'
[something bad has happened, so don't go quietly]
END-IF
GOBACK
.
PROCESS-USER-INPUT.
PERFORM BLANK-OUTPUT-RECORD
PERFORM PROCESS-COC
UNTIL ESC-KEY
.
PROCESS-COC.
DISPLAY FORM1 FORM2
ACCEPT FORM2
ACCEPT ESC-CODE FROM ESCAPE KEY
EVALUATE TRUE
WHEN F10
MOVE 'Entries canceled...' TO ERRMSG
WHEN F2
PERFORM CREATE-OUTPUT
END-EVALUATE
.
CREATE-OUTPUT.
WRITE COC-RECORD
IF ATTEMPT-TO-WRITE-DUPLICATE [22 on the FILE STATUS field]
MOVE 'Duplicate key not allowed...' TO ERRMSG
ELSE
MOVE 'Entries recorded...' TO ERRMSG
PERFORM BLANK-OUTPUT-RECORD
END-IF
.
BLANK-OUTPUT-RECORD.
MOVE SPACES TO COC-RECORD
MOVE ZEROES TO COCNO
.这会让你的程序看起来更简单吗?更容易跟随,改变,理解当别人看它的时候(或者当你在两周内做的时候)。
还有其他的事情,比如为什么把COC-记录设置为空间,然后COCNO设置为零?将空格移动到COCDESC。
使您的数据/过程名称良好并具有描述性。文件状态有一个好的名称(不要称之为文件状态)和一个文件,当你有多个文件。只在必须使用的地方使用句号/句点,并对使用的所有条件结构使用范围分隔符。对所有IO使用文件状态检查,不要在IO上使用曲折的AT。
如果现在看一看,程序中的第一段代码相当长,只执行一次,并且(应该)与程序的业务功能无关。所以,把所有这些都写在一个段落中,然后付诸实施。结束的时候也一样。然后,在启动和关闭程序时,您可以拥有尽可能多的代码,而不会使您的程序更难执行。
发布于 2015-02-15 15:21:35
屏幕和键盘I/O是MicroSoft Cobol特有的风格。您可能需要稍微调整一下,才能使它与OpenCobol一起工作。
发布于 2016-10-06 14:09:05
PROCEDURE DIVISION.
SET ENVIRONMENT 'COB_SCREEN_EXCEPTIONS' TO 'Y'.
SET ENVIRONMENT 'COB_SCREEN_ESC' TO 'Y'.IF cob-crt-status = 2005.IF cob-crt-status = 0.IF cob-crt-status = 1001.IF cob-crt-status = 1002.https://stackoverflow.com/questions/28527058
复制相似问题