在我的一个COBOL程序中有以下代码片段:
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.
换句话说,我需要跳过"MOVE SECOND to WS."。
在cobol中跳转到特定行最简单的方法是什么?我在某处读到,这可以通过定义一个段落,但不知道如何定义它。
这可能看起来很简单,但我是COBOL编程的新手。
谢谢。
----------------* UPDATE *----------
基于@ lawrence解决方案,这是正确的吗?
IF FIRST < SECOND
MOVE FIRST TO WS
GO TO C10-END.
END-IF.
MOVE SECOND TO WS.
C10-END.
MOVE WS TO RESULT.
我只是把最后一条语句移到了第一级。
GOTO可以做你想要的,但是IF/ELSE会更直接。如果IF块不运行,您希望MOVE SECOND TO WS
运行,对吗?
IF FIRST < SECOND
MOVE FIRST TO WS
ELSE
MOVE SECOND TO WS
END-IF.
MOVE WS TO RESULT.
我希望我的语法是正确的,我从来没有使用过COBOL,只是试图完成你的代码片段和这个例子http://www.fluffycat.com/COBOL/If-and-End-If/。将来可能会有需要GOTO的情况,但是A)当另一种控制结构可以工作时应该避免,B)我不知道它是如何完成的
老实说,COBOL看起来很糟糕哈哈。我从未见过一种语言如此冗长。祝你一切顺利
编辑
主要是给joe…
难道这些都不能用最小函数更好地完成吗?我确定语法是错误的,但是:
Move Function Min(FIRST, SECOND) to RESULT
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和句号是因为它们缺乏现代控制结构。我知道你是一个"新手",但你应该建议教你的人,他们真的需要提升他们的技能。
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
类似于C00-MAIN-PROCESS SECTION.
一个新的非答案让这个愚蠢的问题变得清晰起来。
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
No ELSE, No GO TO。当第一个小于第二个时执行额外的MOVE。
包含GO To很简单,但很愚蠢。添加一个GO TO。GO TO必须去某个地方(除非使用ALTER…)继续进行……(每个人都希望你不是),所以在你想要它到达的地方做一个标签,并将该标签的名称添加到GO to .
标签是用户自定义的词。如果被引用(在这种情况下),它在SECTION中必须是唯一的,如果你使用SECTIONs,你不需要,否则在程序中是唯一的,无论是否被引用,它可能与其他东西(如数据定义或文件的内部名称)不相同。
标签是过程名。过程名应该以句号/句号结束,过程本身也应该以句号/句号结束。
MOVE FUNCTION MIN ( ... ) ...
作为一种解决方案呢?
好吧,它起作用了。如果你网站上的其他工作人员不习惯它,你使用它(无论如何,没有事先讨论)将不会得到感谢。
它是做什么的?那么,在Enterprise COBOL中,编译器生成一个额外的小区域,将第一个参数复制到该区域,针对第二个参数进行测试,复制第一个参数的副本,或者第二个参数的副本,无论哪个与结果相关。
与ELSE相比,这是一个额外定义的存储区域,一个额外的可寻址指令,一个额外的汇编器移动(MVC)加上缺乏就绪识别。
更适合刚接触COBOL、习惯了其他语言中的大量函数的程序员吗?不完全是,因为如果他们写不出其他员工(凌晨2点)能理解的程序,他们就会被彻底打败。
IF FUNCTION MIN(VAR1 VAR2 VAR3 VAR4 VAR5) = 17
这是FUNCTION的另一个缺点。你看,你能做到的。然后,在凌晨2点,当程序崩溃32行之后,在更改了VAR1和VAR3之后,您是否能够在核心转储中找到该IF的结果?也许是,也许不是。取决于是否使用了其他函数,以及使用了什么类型的函数。在凌晨2点,你不会想要这样。一点也不。
的好处是,它减少了输入。对于那些打字的人,而不是使用编辑器。
在我们的商店中,我们将使用Bill Woodger提供的示例。但是,我们确实使用句号作为作用域结束符。COBOL应该结构化并使用KISS原则,就像任何其他语言一样。:
<>之前第二步到第二步。如果第一个少于第二个首先是ws。行动是为了结果。之前注意,只有当我们确信SECOND和FIRST有数字值,或者WS是一个PIC X()字符串,而不是一个数字PIC 9()时,这才有效。这是迄今为止最容易读懂的。