如何获取当前段落名称?

时间:2016-06-14 15:04:38

标签: cobol

我想知道如何在COBOL中获取当前段落名称(在此处使用MVS Enterprise COBOL V4.2)。

我们说我在程序部门有这个代码:

   MAIN-LOGIC.
       MOVE SPACE TO ABT-MSG
       PERFORM PARAGRAPH-1
       PERFORM PARAGRAPH-2
       GO TO CLOSE-PROGRAM.
  *
  * SEARCH FOR A VALUE IN AN ARRAY AND GET THE RELATED INDEX
  *
   PARAGRAPH-1.
       MOVE 42 TO SEARCH-VALUE
       PERFORM VARYING I-SEARCH FROM 1 BY 1
           UNTIL SOME-ARRAY(I-SEARCH) = SEARCH-VALUE
         IF (I-SEARCH = MAX-ARRAY-POSITION)
           MOVE SEARCH-ABORT TO ABT-MSG
           MOVE 'PARAGRAPH-1' TO ABT-LOC
           GO TO CLOSE-PROGRAM
         END-IF
       END-PERFORM
       DISPLAY 'VALUE WAS FOUND AT POSITION ' I-SEARCH '.'.
  *
  * STORE A NEW VALUE AT THE END OF AN ARRAY
  *
   PARAGRAPH-2.
       MOVE 42 TO STORAGE-VALUE
       ADD 1 TO I-STORAGE
       IF (I-STORAGE > MAX-ARRAY-POSITION)
         MOVE STORAGE-ABORT TO ABT-MSG
         MOVE 'PARAGRAPH-2' TO ABT-LOC
         GO TO CLOSE-PROGRAM
       END-IF
       MOVE STORAGE-VALUE TO SOME-ARRAY(I-STORAGE).
  *
  * CLOSE THE PROGRAM
  *
   CLOSE-PROGRAM.
       IF ABT-MSG > SPACE
         DISPLAY ABT-MSG
         DISPLAY '(FOUND IN ' ABT-LOC ')'
         MOVE 20 TO RETURN-CODE
       ELSE
         DISPLAY SUCCESS-MESSAGE
       END-IF
       STOP RUN.

我希望能够访问当前段落名称(并将其存储在ABT-LOC中),而不必编写它。 是否有COBOL系统变量,例如' CURR-PARA-NAME'还是什么?

谢谢。

------更新1 -------

我已更新了我的代码示例,使其更具体。 要知道,在我真正的COBOL程序中,有各种各样的SEARCH-ABORT和STORAGE-ABORT可能性(我正在使用许多数组)。

我想让我的代码尽可能好,因此我会访问当前的段落名称而不必写它。

再次感谢你。

-------更新2 ------

那么好吧。我似乎无法做到(我的程序的用户可能会拒绝任何他们不习惯的调试消息 - 为了您的信息,我正在重写一个50年历史的程序,其编程实践非常非常糟糕,例如向上GO TO,直通逻辑和被遗忘的ALTER,我想在最后获得相同的输出。)

不用担心,今晚我不会哭。这只是对我的代码的一种美妙的改进,我可以没有它(我的代码已经比我自己的代码更漂亮了)。

我感谢你们所有人的时间,并祝你们好!...堆叠一天!

2 个答案:

答案 0 :(得分:4)

正如Simon Sobisch在答案中正确指出的那样,完全按照自己的意愿行事的唯一方法就是使用"调试声明"。请参阅答案中的后面部分以了解该工作,但是没有人应该允许您对生产程序执行此操作。

COBOL是一种编译语言,因此除非编译器提供可用的内容,否则不会自动访问任何数据名称或过程名称(段落或SECTION)。其中,除上述情况外,它没有。

这留下了三种方法:手动完成(你正确想要避免这种方法,就像桃子有人要复制或重新定位代码而不改变文字一样);预处理(使用程序或编辑器)使用正确的标签自动填充您的字段;做其他事。

由于你隐含地对第一个进行打折,我再次相信,让我们考虑第二个。如果你在同一段/ SECTION中有两件,三件或八件事,那就是"商业错误" (虽然通常这些类型的东西更多"完整性错误",一个不应存在的状态,所以不要继续)?

因为你会得到那些,一个"预处理"解决方案开始变得更加难看。

还能做些什么?

嗯,这是我们多年来所面对的事情。答案是,唯一的(在程序内)错误号。可以命名个别错误,并给出一个数字。名称错误的引用难以使用"错误"。添加新错误时,很难复制现有数字。或者,换句话说,它很容易复制,但很容易在测试中发现 - "嘿,那产生了1234,这是错误的"。

它绝不是防弹的,但数据名称(以及任何相关的文本)比段落名称更好地指示问题(除了人工,任何指示之外不会这样做)错误是什么,只是它的位置)。在程序中很容易找到错误引用,从中可以很容易地找到程序名称,除非您实际上不再需要它。

具有错误数字的程序是否超过手动维护MOVE' literal'一些标准名称的程序是未知的。但你可以猜出我赞成并推荐。

现在,如何使用DECLARATIVES为Enterprise COBOL执行此操作。

   IDENTIFICATION DIVISION. 
   PROGRAM-ID. STAB39. 
   ENVIRONMENT DIVISION. 
   CONFIGURATION SECTION. 
   SOURCE-COMPUTER. FRED DEBUGGING MODE. 

   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   01  W-WHEN-COMPILED                     PIC X(8)BX(8).
   01  ABT-LOC                             PIC X(30). 


   PROCEDURE DIVISION. 
  DDECLARATIVES. 
  DSOME-SECTION SECTION. 
  D    USE FOR DEBUGGING ON ALL PROCEDURES 
  D    . 
  DSOME-PARA. 
  D    MOVE DEBUG-NAME TO ABT-LOC 
  D    . 
  DEND DECLARATIVES. 
   STARTING-UP SECTION. 
       DISPLAY 
               ABT-LOC 
  D    DISPLAY 
  D            "IT IS STARTING UP" 
       MOVE WHEN-COMPILED           TO W-WHEN-COMPILED 
       DISPLAY 
               "STAB39 " 
               W-WHEN-COMPILED 
       . 
   A-PARA. 
       DISPLAY 
               ABT-LOC 
       PERFORM 
         10 TIMES 
  D        DISPLAY 
                   "ITERATING" 
       END-PERFORM 
       . 
   ANOTHER-PARA. 
       DISPLAY 
               ABT-LOC 
       PERFORM                      THE-PARA 
                                     10 TIMES 
       PERFORM                      THE-SECOND-PARA 
       GOBACK 
       . 
   THE-PARA. 
       DISPLAY 
               ABT-LOC 
       . 
   THE-SECOND-PARA. 
       DISPLAY 
               ABT-LOC
       . 

一些注意事项:

SOURCE-COMPUTER段落需要使用COBOL内置调试功能才能打开它们。因此,环境部门和配置部分也是必需的。示例中的"计算机名称",FRED是必需的,但它是无关紧要的。你可以"命名"你喜欢的宠物或亲戚之后你的电脑,或者在那里放任何东西,只需要有东西。

DECLARATIVES只能在程序部门的开头指定。它们必须在SECTION中,并且所有操作必须在属于SECTION的段落内。 SECTION和段落的名称无关紧要,但无论如何都要使它们有意义。

因为DECLARATIVES必须包含SECTION,如果您的第一个程序标签不是SECTION,您将收到信息诊断消息。这不需要在程序中使用SECTIONS而不是段落,它没有进一步的效果。

第7列中的D表示"调试行"。这些行只能在使用SOURCE-COMPUTER段打开调试时生成代码。

除了GO TO之外,程序练习使用段落(并且对于此示例使用SECTION没有区别)。转到的段落将产生与任何其他参考相同的结果,但您不会在我的程序中看到GO TO: - )

可以命名您想要的程序或陷阱"与DECLARATIVES而不是使用" ALL PROCEDURES"。

您可能有多个DEBUGGING程序,如果您愿意,可以在其中包含大量代码(例如,设置测试条件)。

虽然这个功能已经在COBOL中存在了很长时间,但可以说它没有被广泛使用,特别是作为特定的"调试产品"变得可用。

仅仅拥有这个程序,"运行时间"是不够的。如果它不是默认值,则需要打开DEBUG。 z / OS上的运行时称为语言环境,由多种语言共享(允许简单的语言间通信)。语言包括C / C ++,PL / I和Java以及COBOL。有语言环境例程和宏可用于制作HLASM /汇编程序"符合LE"也提供了现成的接口。

要查看您的站点默认的运行时选项,最简单的方法是在运行JCL中包含CEEOPTS DD语句。

//CEEOPTS  DD  *
   RPTOPTS(ON) 

这将列出用于" Enclave"的所有选项。 (您的运行环境)并指出每个选项的来源。

如果在OPTION列中看到NODEBUG,则默认情况下关闭COBOL调试。为特定的运行打开它:

//CEEOPTS  DD  *
   DEBUG 

这将允许所有D标记的调试行和调试DECLARATIVES执行。

这可以做你想要的,但没有人会允许调试的程序进入生产,所以你不能将它用于你想要的。

按照优先顺序,我建议错误号码(和测试),自动化,手工编码的程序名称文字。

IBM完整记录了其所有产品,您可以找到适用于您的z / OS版本的Enterprise COBOL V4.2和语言环境(几个)的文档(语言参考和编程指南等)。

最后一点。不要使用GO TO来打破"打破"您的正常处理流程。使用PERFORM。即便在逻辑上,PERFORM也无法返回。使用GO TO将关闭包含GO TO的段落/ SECTION的编译器优化,这很容易对执行产生明显的影响。这与IBM COBOL确保在CALL之间不保留PERFORMed段/ SECTION的状态之前的建议相反。那时正确的建议是使用GO TO。这不再是正确的建议。

答案 1 :(得分:2)

因为你有伪代码“这里发生了一些不好的事情”我假设一个例外。在这种情况下,标准(COBOL 2002,COBOL 2014)函数EXCEPTION-LOCATION可能会有所帮助(尽管实际字符串是实现者定义的,我假设段落可能在那里[例如GnuCOBOL具有格式:program-id;段落[或部分或部分,取决于您的程序];源代码行]。

如果你的COBOL编译器在这个函数中提供了这个信息,并且已经在违规部分中没有例外:通过subtract 1 from unsigned-var或类似的创建一个。

正如Bill已经说过(或暗示):如果您必须将名称作为标识符和标签,那么这个问题是实际使用的COBOL编译器将是最重要的部分。

编辑 (在知道实际的COBOL编译器之后):

IBM MVS Enterprise COBOL没有EXCEPTION-LOCATION功能。因此,我只看到一个内置解决方案:

DECLARATIVES.
debug-declaratives SECTION.
   USE FOR DEBUGGING ON ALL PROCEDURES.
debug-par.
    MOVE debug-name  TO current-procedure.
END DECLARATIVES.

但是,如果您的程序在调试模式下运行(这可能会导致大量调试消息发生),这只是活动的我不建议实际使用此

尝试使用提供宏的编辑器(或在实际源上运行shell脚本)来创建之后传递给编译器的源。