【问题标题】:Why is the second if statement in this Cobol code not being evaluated (OpenCOBOL)?为什么不评估此 Cobol 代码中的第二个 if 语句 (OpenCOBOL)?
【发布时间】:2013-04-17 19:19:35
【问题描述】:
   identification division.
   program-id.      quick.
   environment division.
   data division.
   working-storage section.
   01 temp-val1 pic 9 value 1.
   01 temp-val2 pic 9 value 2.
   procedure division.
    mainline.
           perform encrypt.
           stop run.
    encrypt.
           if (temp-val1 = 1)
             display "1"
             display "2".
           end_if.
           if (temp-val2 = 2)
             display "2"
             display "1".
           end_if.
           display "outside the ifs".

程序的输出很简单:
1
2

但我希望:

1
2
2
1
在ifs之外

我做错了什么?我是否误解了第一个 if 中语句的句子结构或句号的位置?

【问题讨论】:

  • 您正在混淆 COBOL 编码样式。这会导致意外的控制权转移。查看COBOL Transfer of Control。也就是说,我希望编译器会在您的end-if. 上引发错误或至少发出警告
  • 好的,一旦卢克发现问题,就不是编译器错误。适合我查看更好的示例,而不是问题中的代码:-)
  • @NealB 感谢您的链接,它很有帮助。

标签: if-statement cobol sentence gnucobol


【解决方案1】:

代码有两个问题。一个是end-if 之前的时间段。

另一个是end_ifend-if不一样。在 Cobol 中仅使用 end-ifend_if 被视为段落名称。因此,它不会(也不应该)产生编译器警告消息。

【讨论】:

  • 锐利的眼睛...这将使两个段落具有相同的名称(END_IF)。我不认为这是“非法的”,只是非常规。我还认为,如果引用了其中一种情况(例如 PERFORM END_IF),编译器应该抛出错误/警告,因为无法唯一解析名称。
  • 这是正确答案,因为它(主要)解释了为什么编译器也没有报告错误。 end_if 作为一个段落导致加密的 PERFORM 在刚刚完成一个 IF 后结束。未引用的重复段落名称可能是“有效的”,尽管由于它们都不在 SECTION 中,因此它们永远不会被引用(我认为,如果引用它们,它们都需要在 SECTIONs 中才能真正有效)。固定格式的 COBOL 为诊断问题提供了一些额外的可能性,例如“ 应该从区域 A 开始”:-)
【解决方案2】:

反复试验证明问题是语法和句点放置错误的混合。

这可以提供预期的输出。

   identification division.
   program-id.      quick.
   environment division.
   data division.
   working-storage section.
   01 temp-val1 pic 9 value 1.
   01 temp-val2 pic 9 value 2.
   procedure division.
    mainline.
           perform encrypt.
           stop run.
    encrypt.
           IF (temp-val1 = 1)
             display "1"
             display "2"
           END-IF
           if (temp-val2 = 2)
             display "2"
             display "1"
           END-IF
           display "outside the ifs".

openCobol 程序员指南中的示例代码帮助我解决了这个问题。 http://opencobol.add1tocobol.com/OpenCOBOL%20Programmers%20Guide.pdf

【讨论】:

    【解决方案3】:

    说白了

        display "2".
       end_if.
    

    '.'在 "2" 结束 if 语句之后,你有另一个 end_if 和 . Open-Cobol 可能会将其作为程序的结束 - 可能不是最好的解释。

    正如尼克所说的**不要混合编码风格。

    我个人会放一个“。”在每个过程结束时单独一行

    encrypt.
               IF (temp-val1 = 1)
                 display "1"
                 display "2"
               END-IF
               if (temp-val2 = 2)
                 display "2"
                 display "1"
               END-IF
               display "outside the ifs"
    
               .
    

    【讨论】:

    • 看起来不错。到那时,您可能希望“杂散”结束时出现编译错误。不仅是第二个 IF 没有完成,而且后面的 DISPLAY 也没有完成,所以我认为你对它偏离段落是正确的。
    • 是的,很抱歉不清楚。这就是我所说的“编译错误”。如果版本是最新的,则没有“编译错误”的事实表明“编译器er 错误”。如果编译器的“旧”版本,很可能已经修复。我不知道有任何 Cobol 可以成功编译它。编译器应该两次记录相同的语法错误。
    • 为了清晰起见,我喜欢将单个句点放在段落末尾的这种风格。感谢您的提示!
    猜你喜欢
    • 2016-11-20
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多