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上不是很先进。
答案 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。
答案 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。一个“。”或句号,终止所有打开的条件并重置事物,让你喜欢或不喜欢。