【问题标题】:Exit outer loop from subroutine without logical variable从没有逻辑变量的子程序退出外循环
【发布时间】:2016-06-28 07:28:20
【问题描述】:

以下最小示例:

L1: do while(.true.)
    L2: do while(.true.)
        if(something=.true.) exit L1
    end do L2
end do L1

所以现在我想将内部循环 L2 写入单独模块中的子例程中,以便在编译代码时将它们链接在一起,例如 gfortran main.f95 innerloop.o -o somename

module innerloop
contains 
    subroutine innerloop()
    L2: do.....
        if(something=.true.) exit L1
    ...
end module innerloop

即使我通过具有全局变量的模块将循环名称设置为全局字符,我也会遇到各种错误。由于存在大量各种 if 情况,因此不知道将全局变量定义为标志并执行以下操作: 如果(某事=.true。)exitvar=.true。 然后在变量为 .true 时在每个子例程或函数后面编写一个 if-case。或不逐步退出所有循环。 是否有另一种方法可以在 de 模块的单独子例程中从内部循环退出外部循环?

【问题讨论】:

  • 请注意,您需要== 进行逻辑比较。
  • 还要注意(something==.true.)==(something),与.true.的比较是多余的。
  • @HighPerformanceMark 也是非标准的。
  • @IanH:D'ohhh,当然也是这样。
  • 出于历史兴趣,您过去可以通过 alternate return 来完成此任务。谢天谢地,这已经贬值了。

标签: loops module fortran exit subroutine


【解决方案1】:

您的方法违反了 Fortran 关于“跳转”范围的规则,无论它们是 exits 还是 gotos 或类似的构造。换句话说,您可以按照您建议的方式从标记的 do-loop 中忘记 exit-ing。

我得到各种错误,即使我将循环名称设置为全局字符是的,do(或类似)构造上的 construct-name 是不是字符变量或常量或任何其他可以在执行期间设置的东西。

Fortran 在跳转范围方面的理智是一件好事,这使得编写意大利面条式代码变得更加困难。您不想使用全局变量作为标志,也不应该这样做。使用局部变量,可能是这样的

module innerloop
contains 
    subroutine innerloop(l1return)
    logical, intent(out) :: l1return
    l1return = .false.
    L2: do.....
        if (something) then
          l1return = .true.
          exit L2
        end if
    ...
end module innerloop

是的,您现在必须测试子例程是否提前完成,但这是一个很小的代价,可以避免从一个范围无限制地跳转到另一个范围所带来的疯狂。

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 2015-07-13
    • 2013-04-26
    • 2012-12-30
    • 2023-02-23
    • 2012-11-03
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多