【问题标题】:how to use GO TO in COBOL如何在 COBOL 中使用 GO TO
【发布时间】:2011-08-18 05:42:15
【问题描述】:

我的一个 COBOL 程序中有以下代码 sn-p。

IF  FIRST < SECOND
   MOVE FIRST TO WS
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

我需要在 IF 块中使用 GO TO 跳转到最后一条语句(MOVE WS TO RESULT)。

IF  FIRST < SECOND
   MOVE FIRST TO WS
   GO TO <last line.(MOVE WS to RESULT)>
END-IF.
MOVE SECOND TO WS.
MOVE WS TO RESULT.

换句话说,我需要跳过“第二次移动到 WS”。
跳转到cobol中特定行的最简单方法是什么? 我在某处读到,这可以通过定义一个 PARAGRAPH 来实现,但不知道如何定义它。

这可能看起来很简单,但我是 COBOL 编程的新手。

谢谢。

----------------* 更新 *----------

基于@lawerence 解决方案,这是正确的吗?

IF  FIRST < SECOND
     MOVE FIRST TO WS
     GO TO C10-END.
  END-IF.

  MOVE SECOND TO WS.

C10-END.
MOVE WS TO RESULT.

我刚刚将最后一条语句移回第一级。

【问题讨论】:

  • 我不知道 COBOL,但它允许标记语句吗?
  • 缩进可能很重要,具体取决于编译器。 IF 应与END-IF 对齐,MOVE WS TO RESULT 也应与END-IF 对齐
  • 引用“我需要使用 GO TO”——在过去的 30 年中,COBOL 程序员被建议不惜一切代价避免使用 GO TO。它仍然实现的唯一原因是仍然有这么多 40 年的代码。没有人需要使用 GO TO,没有人应该使用 GO TO,任何在 21 世纪编写 GO TO 代码的人都应该考虑转行。
  • @James Anderson--同意。您使用的@mohammad shamsi 不支持 IF ELSE 的 COBOL 方言有多久了?
  • 问题不在于编译器缺乏对 IF/ELSE 的支持,它显然有。问题是“GO TO C10-END”结尾的句号。 -- 句号是核武器类型的范围终结符 -- 它终止所有活动范围。删除句点,更新后的代码将正常工作,ELSE 也是如此。

标签: cobol go-to-definition


【解决方案1】:

一个新的未回答问题让这个愚蠢的问题浮出水面。

IF 中的 ELSE 是 100% 显而易见的答案。很奇怪,必须使用 GO TO 而不能使用 ELSE。

另一种方式,很惊讶它没有出现:

MOVE SECOND TO WS
IF  FIRST LESS THAN SECOND
   MOVE FIRST TO WS
END-IF
MOVE WS TO RESULT

没有 ELSE,没有 GO TO。但是,当 FIRST 小于秒时会执行额外的 MOVE。

包含一个 GO TO 很简单,但很愚蠢。添加一个转到。 GO TO 必须去某个地方(除非使用 ALTER ... TO PROCEED TO ...,每个人都希望你不是这样),所以在你希望它到达的地方制作一个标签,并添加该标签的名称转到转到。

标签是用户定义的词。如果被引用(如在本例中),它必须在一个 SECTION 中是唯一的,如果您使用 SECTION,则不需要,否则在程序中是唯一的,并且无论是否被引用,它可能与其他名称不同(如数据定义或文件的内部名称)。

标签是过程名称。过程名称应以句点/句号结尾,过程本身也应以句点/句号结尾。

MOVE FUNCTION MIN ( ... ) ... 作为解决方案怎么样?

嗯,它有效。如果您站点的其他工作人员不习惯它,您将不会因为使用它而受到感谢(无论如何,无需事先讨论)。

它有什么作用?好吧,在 Enterprise COBOL 中,编译器生成一个额外的小区域,将第一个参数复制到该区域,针对第二个参数进行测试,将第一个参数或第二个参数的副本复制到结果中。

与 ELSE 相比,ELSE 定义了一个额外的存储区域、一个用于寻址的额外指令、一个额外的汇编程序移动 (MVC) 以及缺乏就绪识别。

对于刚接触 COBOL、习惯于其他语言的大量函数的程序员来说更好吗?不是真的,因为如果他们不编写其他员工可以理解的程序(凌晨 2 点),他们将被彻底击败。

IF FUNCTION MIN(VAR1 VAR2 VAR3 VAR4 VAR5) = 17

这是 FUNCTION 的另一个缺点。你看,你可以做到。然后,在凌晨 2 点,当程序在 32 行之后崩溃时,在更改 VAR1 和 VAR3 之后,您是否能够在核心转储中找到该 IF 的结果?也许,也许不是。取决于是否使用了任何其他功能,以及使用了什么类型。凌晨 2 点,你不想要那个。一点也不。

从好的方面来说,它减少了打字。对于那些打字而不是使用编辑器的人。

【讨论】:

    【解决方案2】:

    在我们的商店中,我们将使用 Bill Woodger 提供的示例。但是,我们确实使用句点作为范围终止符。 COBOL 应该像任何其他语言一样结构化并使用 KISS 原则。这个:

    第二次移动到 WS。 如果第一次不到第二次 首先移动到 WS。 将 WS 移至结果。

    请注意,只有当我们确信 SECOND 和 FIRST 具有数值,或者 WS 是 PIC X() 字符串,而不是数字 PIC 9() 时,这才有效。 这是迄今为止最容易阅读的。不需要 ELSE 或 GO TO。

    【讨论】:

    • 这不是一个很好的例子。使用没有 end-if 范围终止符的 if 语句会使其更难阅读。
    【解决方案3】:

    GOTO 可以满足您的需求,但 IF/ELSE 会更直接。你想让MOVE SECOND TO WS 在 IF 块没有运行的情况下运行,对吗?

    IF  FIRST < SECOND
        MOVE FIRST TO WS
    ELSE
        MOVE SECOND TO WS
    END-IF.
    MOVE WS TO RESULT. 
    

    我希望我的语法是正确的,我从未使用过 COBOL,只是尝试处理你的 sn-p 和这个示例 http://www.fluffycat.com/COBOL/If-and-End-If/。将来可能会出现需要 GOTO 的情况,但是 A) 当另一个控制结构可以工作时应该避免它 B) 我一点也不知道它是如何完成的

    说实话,COBOL 看起来很糟糕,哈哈。我从未见过如此冗长的语言。祝你一切顺利


    编辑


    主要是为了乔……

    这一切都不能用 min 函数更好地完成吗?我确定语法是错误的,但是:

    Move Function Min(FIRST, SECOND) to RESULT
    

    【讨论】:

    • @jon_darstar:由于某些原因,我不能使用 ELSE,我必须使用 GOTO 来处理它。顺便说一句。
    • 如果你有时间很想听听他们的声音
    • +1 表示使用 Else/End-If... 和 -0,但我希望它可以是 -1 表示它看起来很糟糕。删除你的周期并清理你的逻辑,然后:“如果 FIRST
    • 是的,我认识到,除非有我们看不到的重要内容,否则WS 是无关紧要的。我并没有试图彻底检查他的代码,它不是我要改变的。只是想指出IF/ELSE。我不是想在 COBOL 上拉屎,只是分享我的第一印象。我坚持认为它不是一种语言,我会特别兴奋地学习。顺便说一句 - 我不知道这些时期是什么意思。您的代码确实看起来稍微好一点,但是我们都忽略了一些更简单的东西吗?检查我的编辑
    • 如果 FIRST 和 SECOND 是数字项,则函数 Min 非常有用。这是一个很好的解决方案。
    【解决方案4】:

    OMFSM!不是 1974 年,你为什么要这样写 Cobol?这个:

    IF  FIRST < SECOND
       MOVE FIRST TO WS
    END-IF.
    MOVE SECOND TO WS.
    MOVE WS TO RESULT.
    

    有很多问题:

    • 它使用句点来划定范围,已弃用近三个十年。
    • 它没有使用 ELSE
    • 它正在尝试使用 GO TO。

    我可以建议以下作为自 1985 年以来的处理方式:

    If FIRST < SECOND
      Move FIRST to WS
    Else
      Move SECOND to WS
    End-IF
    Move WS to RESULT
    

    但实际上,代码应该是这样的:

    If FIRST < SECOND
      Move FIRST to RESULT
    Else
      Move SECOND to RESULT
    End-If
    

    除非在 WS 中需要中间结果。 Cobol 66 和 74 使用 GOTO 和句点,因为它们缺乏现代控制结构。我知道你是一个“新手”,但你应该向教你的人建议他们确实需要提升自己的技能。

    【讨论】:

    • Move Function Min(FIRST, SECOND) to RESULT 怎么样?
    • @jon_darkstar -- 函数 min() 确实是这段代码所做的,你完全正确,但这是标准的一部分还是 Enterprise Cobol 的一部分?我不确定。
    • @JoshStodola - 我经常在这里看到恐怖表演的家庭作业问题,我不会让懒惰的教授通过。如果他们不能升级他们的教科书并教授现代 Cobol,将会发生两件事:1)他们的学生不会像今天使用的那样学习 Cobol;2)他们的学生不会找到工作。可悲的是,学生不知道他们正在学习可怕的过时方法,必须有人告诉他们。
    【解决方案5】:

    jon_darkstar 在改进逻辑方面是正确的,但是如果您想了解GO TO 的工作原理,请前往:

      IF  FIRST < SECOND
         MOVE FIRST TO WS
         GO TO C10-RESULT.
      END-IF.
    
      MOVE SECOND TO WS.
    
    C10-RESULT.
      MOVE WS TO RESULT.
    

    C10-RESULT. 开始一个段落,并且必须是代码 SECTION 中的唯一名称。按照惯例,它也应该以与封闭部分相同的前缀开头。因此,此示例假定您的代码 SECTION 类似于 C00-MAIN-PROCESS SECTION.

    【讨论】:

    • 所以你可能想在 &lt;angle brackets&gt;C10-RESULT 之间更改这些东西?
    • np............ =D 我很高兴你发布了,因为我有点回避了他的问题,而且我对查找 COBOL 语法的兴趣比我已经做的更多跨度>
    • @lawrence:如果我理解正确,最后一个语句(MOVE WS TO RESULT)属于 C10-RESULT 段落。我们可以有一个空的段落吗? (假设我们不想将最后一个语句放在某个段落下)
    • 可能会丢失“转到 C10-RESULT”之后的时间段。 if 被显式的“END IF”关闭。
    • 这段代码确实属于The Daily WTF。看到有人认真地写出这样的东西,我的心就沉了。
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多