【问题标题】:Error return, gotos and code duplication in modern Fortran现代 Fortran 中的错误返回、goto 和代码重复
【发布时间】:2021-12-24 11:25:58
【问题描述】:

在旧的 Fortran 代码中,找到这种结构是相对常见的:

irc=0
...
if (foo) goto 10
...
if (bar) goto 10
...
return
10 irc=1
return

即,irc 变量保存返回码,每当发生错误时,一个简单的goto 10 即可完成设置值和从子例程返回。

在现代代码中,人们不惜一切代价试图避免gotos (https://xkcd.com/292/),重写它的最佳方法是什么?微不足道的内联会导致大量代码重复和替换 returns(看起来几乎和 gotos 一样糟糕):

irc=0
...
if (foo) then
  irc=1
  return
end if
...
if (bar) then
  irc=1
  return
end if
...
return

为了避免代码重复,可以使用内部子例程(尤其是如果每次要重复多个语句),但这仍然会留下returns。或者有什么方法可以强制从内部子程序返回主机子程序?还有其他解决方案吗?

【问题讨论】:

    标签: fortran goto


    【解决方案1】:

    一个过程不可能完成不同过程的执行(除非通过程序终止)。也就是说,内部过程的 RETURN 语句不能用于管理所需的流程。

    但是,可以使用BLOCK construct 管理此处所需的流,例如通过以下方式:

    main_flow: block
       irc=0
       ...
       if (foo) exit main_flow
       ...
       if (bar) exit main_flow
       ...
       return
    end block main_flow
    ...
    

    显然,条件和动作可能会涉及更多,如果一个人不愿意从程序中间返回,则可以在块外进行测试。

    块结构是这样的,从内部的 EXIT 就像一个 GO TO 到块的末尾。

    具有单次迭代计数的 DO 构造也可以act in this way

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2018-09-04
      • 2021-02-11
      • 1970-01-01
      • 2015-01-18
      • 2014-07-03
      • 1970-01-01
      • 2016-08-06
      • 2015-01-17
      相关资源
      最近更新 更多