IF和ELSE问题

时间:2014-12-12 21:16:46

标签: cobol mainframe

           IF LINE-CTR < PAGE-LIMIT
           ADD 1 TO LINE-CTR.
           WRITE REPORT-RECORD         FROM DETAIL-LINE.
       ELSE    //statement is invalid
           ADD 1 TO PAGE-NUMBER.    //cancel expected after this token
           LINE-CTR EQUALS ZERO.
           MOVE PAGE-NUMBER TO PAGE-NUMBER-OUT.
           WRITE REPORT-RECORD FROM HEADING-LINE-1.
           WRITE AFTER ADVANCING PAGE REPORT-RECORD FROM DETAIL-LINE.   //missing identifier
       END-IF.

我收到了多个错误,而且我不确定我在哪里出错了。请跟我保持简单,我在COBOL上不是很先进。

3 个答案:

答案 0 :(得分:3)

Get rid of all the full-stops/periods in the code you show.

这意味着摆脱所有

如果您的END-IF是段落/ SECTION中的最后一个,添加一个新行,并在第12列中设置一个句号/句点。这满足了一个段落/ SECTION以一个完整的结束的要求停止/周期而不将其附加到一行代码。

如果您将一个句号/句号附加到一行代码(甚至是END-IF),那么当您在其他地方复制该代码块时,您必须考虑是否取消整个句号/期间,或者离开它。如果它不在那里,你就不会面对这个决定。

一旦你获得了更多的经验,你就不会这样做,所以不必考虑它,你将会这样做,以便你团队中的其他人不必考虑它。

最初在COBOL中,PROCEDURE DIVISION中的每个陈述都是一个&#34;句子&#34;,以句号结束时的句号/句号结束。

如何为IF工作?这意味着IF内的所有内容都没有一个句号/句号,因为一个句号/句号会终止IF。这又意味着代码行

MOVE A TO B

当它不在IF中时会有一个完整的停止/期间,并且当它在IF中时没有完整的停止/期间。

如果您要重新定位无条件MOVE以使其成为条件,则必须记住删除句号/句号,否则您将破坏现有逻辑。

随着1985年COBOL标准的改变。新的&#34;范围分隔符&#34;添加了允许关闭所有条件语句和命令性条款(如AT END上的SEARCH)。

这意味着现在可以以相同的方式对MOVE A TO B进行编码,无论是在IF内还是在IF之外。使重定位/复制代码行变得更加容易。

许多人坚持旧的方式,即使没有,仍然有一些程序是在1985年标准之前编写的,所以你会看到代码中的每一条无条件的行以一个句号/句号结束。这已经不再需要了,但不要为了它的乐趣而改变它们。如果该程序已经有睡狗,让他们撒谎。但是不要以这种方式编写新代码。

这是CALLed计划的概要程序部分:

 PROCEDURE DIVISION            USING parameter-1
                                     parameter-2
                                     .
     PERFORM                         something
     PERFORM                         something-else
     GOBACK
     .
 something.
     some code here
     .
 something-else.
     some more code here
     .

唯一的止损/期间是你看到的,你可以看到它们。

关于这个问题,请在手册中查找NEXT SENTENCE。您可以在现有代码中找到它,因此您需要了解它。在新代码中使用它是愚蠢的。

IF A EQUAL TO B
    NEXT SENTENCE
ELSE
    MOVE C TO D.

注意终止IF的句号/句号。 NEXT SENTENCE是一个秘密GO TO&#34;。它使用在编译器找到的下一个完整停止/周期后立即生成代码分支。

IBM允许其在END-IF中继续使用(1985年的标准没有)。

IF A EQUAL TO B
    NEXT SENTENCE
ELSE
    MOVE C TO D
END-IF

该代码将搜索下一个句号/期间,这可能只是在段落的末尾,使得遵循IF条件的代码 - 所以不要使用NEXT SENTENCE。只需使用CONTINUE。

IF A EQUAL TO B
    CONTINUE
ELSE
    MOVE C TO D
END-IF

如果你想知道为什么你会看到这种结构,一些本地网站标准禁止使用负面条件(是的,真的)。所以为了得到否定,你需要像那样编码...

小费。

把你的&#34;写一个细节线&#34;代码段落/段落。在该段/ SECTION中检查您打印的行数。

然后,您缩短了代码,并使其更易于维护(如果页面大小发生更改,则只在一个位置)。也使用88s。

这也避免了在启动程序时必须写出标题。相反,请确保将行数设置为表示&#34; full&#34;的值。这也意味着当没有要打印的细节线时,您不会获得标题(尽管在这种情况下您需要多次在报告中打印一行&#34;此报告为空&# 34;或者就此而言的话语。)


摆脱所显示代码中的所有句号/句号。

全程/期限将立即终止任何有条件/命令性声明。

尽可能少地使用PROCEDURE DIVISION中的句号。

这是最近的回答:

  

即:PROCEDURE DIVISION标题结束(如果你有其中一个,则使用USING之后的项目);在段落/部分之前;段落/ SECTION标签的结尾;段落/部分结束;该计划结束。

     

那里有一些重叠,因为程序不要求其中有段落/ SECTIONS。

以下是答案:https://stackoverflow.com/a/27441321/1927206

答案 1 :(得分:3)

比尔说,摆脱句号。 A&#39;。&#39;将结束所有先前的ifs

 IF blah blah
     IF blah blah again
         IF blah blah !!

            . *> <- this will end all 3 if statements.

代码

  IF LINE-CTR < PAGE-LIMIT
      ADD 1 TO LINE-CTR.  *> end of IF because of the '.'

另外,这条线应该是什么???

 LINE-CTR EQUALS ZERO.

应该是

 Move 0                   to line-ctr 

强烈建议仅使用&#39;。&#39;只有在绝对需要时(程序结束等)。请注意,我没有&#39;。&#39;在我的逻辑代码中:

   my-proc.

       IF LINE-CTR < PAGE-LIMIT
           ADD 1                         TO LINE-CTR
           WRITE REPORT-RECORD         FROM DETAIL-LINE
       ELSE   
          ADD 1                          TO PAGE-NUMBER
          Move 0                         to line-ctr      *> ???

          MOVE PAGE-NUMBER               TO PAGE-NUMBER-OUT
          WRITE REPORT-RECORD          FROM HEADING-LINE-1
          WRITE AFTER ADVANCING PAGE 
                REPORT-RECORD          FROM DETAIL-LINE   
      END-IF



      .   *> Full stop by itself at the end

遵循此代码策略,更容易发现错误。

在大型机ISPF编辑器中,您可以使用以下命令:

X all;F '.' all;f procedure first 

显示带有&#39;的所有行。&#39;在他们中。在PC / Linux编辑器上,您可以使用正则表达式 找到之前没有白色的&#39; ...对于JEdit寻找:

[^\s].

这将跳过&#39;。&#39;本身

.

但找到

 LINE-CTR EQUALS ZERO.

也可以排列等等,这样可以更容易阅读。这将使您的工作更轻松(并且您更有可能以这种方式获得帮助)

答案 2 :(得分:1)

你不能在现代Cobol的开放代码中使用一段时间(又名“完全停止”)而不会给自己带来很多麻烦。它是一种史前构造,只适用于非常非常非常古老的代码。由于你有“End-if”,你的编译器必须使用Cobol-85 complieant,因此规则绝对不会使用句号,除非你需要它。

您在Cobol-85代码中唯一需要一段时间的地方是:

- 在分区或部分标题的末尾,例如“程序划分。”   - 在段落名称的末尾,例如“增量页号码。”   - 在一个段落的末尾,让你记住并看到这个的好方法是使用NOP词“退出”。或“继续”。这样读者就可以看到这段时期。

一般来说,句号(或句号)完全是邪恶的,并且是过去30年来编写的Cobol代码中众多错误的来源。如果可能的话,你应该避免它。

要解决您的实际问题,您需要的是:

  IF LINE-CTR < PAGE-LIMIT
       ADD 1 TO LINE-CTR
       WRITE REPORT-RECORD FROM DETAIL-LINE
   ELSE
       ADD 1 TO PAGE-NUMBER
       MOVE PAGE-NUMBER TO PAGE-NUMBER-OUT
       WRITE REPORT-RECORD FROM HEADING-LINE-1
       WRITE AFTER ADVANCING PAGE REPORT-RECORD FROM DETAIL-LINE
   END-IF

我不能强调,不要混合“。”与“结束 - *”,这是完全糟糕的juju。一个“。”或句号,终止所有打开的条件并重置事物,让你喜欢或不喜欢。