首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接受“ESC-从转义键编码”的问题

接受“ESC-从转义键编码”的问题
EN

Stack Overflow用户
提问于 2015-02-15 14:25:44
回答 3查看 1.8K关注 0票数 2

使用,MicrosoftCOBOLCompilerVersion2.2,和我的代码完全可以正常工作。

代码语言:javascript
复制
   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

代码语言:javascript
复制
 03 LINE 1 COLUMN 1 'COCNO'.
 03 LINE 2 COLUMN 1 'COCDESC'.
 03 LINE 24 COLUMN 1 "Esc=Exit  F2=Save  F10=Cancel".

因此,我通过添加关键字来修复它们:

代码语言:javascript
复制
 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.

这可能是什么原因?解决这个问题的办法是什么?

EN

回答 3

Stack Overflow用户

发布于 2015-02-16 00:58:24

您的实际答案在这里,https://sourceforge.net/p/open-cobol/discussion/help/thread/26a01c5f/,在SourceForge的GnuCOBOL部分。只要稍加改动,您的代码就会“完全”使用您已经完成的包含VALUE子句的更改,如果您使用的是GnuCOBOL编译器的2.0版或更高版本。

您的代码可能“完全工作”,但它是意大利面代码。

这个词来源于过去,涉及到在程序中使用许多分支,这是当时的一种常见做法,但它使试图遵循逻辑的过程就像试图遵循一串煮熟的意大利面一样,这是一堆煮熟的意大利面的一部分。

如果您改变了这一点:

代码语言:javascript
复制
PERFORM ENTRY1 THRU ENTRYX UNTIL ESC-KEY.

对此:

代码语言:javascript
复制
PERFORM ENTRY1 THRU ENTRYX.

你的程序还能用。迷惑了?是的,因为你有意大利面。您的程序流只会到达ENTRYX一次。当它到达ENTRYX时,它的值是ESC-键,但这是多余的,因为它只能到达一次,当它是ESC-键时。明白了吗?不是吗?因为你有意大利面。

这是你的逻辑,重写:

代码语言:javascript
复制
   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。

如果现在看一看,程序中的第一段代码相当长,只执行一次,并且(应该)与程序的业务功能无关。所以,把所有这些都写在一个段落中,然后付诸实施。结束的时候也一样。然后,在启动和关闭程序时,您可以拥有尽可能多的代码,而不会使您的程序更难执行。

票数 4
EN

Stack Overflow用户

发布于 2015-02-15 15:21:35

屏幕和键盘I/O是MicroSoft Cobol特有的风格。您可能需要稍微调整一下,才能使它与OpenCobol一起工作。

票数 3
EN

Stack Overflow用户

发布于 2016-10-06 14:09:05

代码语言:javascript
复制
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.
  • F1:IF cob-crt-status = 1001.
  • F2:IF cob-crt-status = 1002.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28527058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档