从没有逻辑变量的子程序中退出外层循环

Exit outer loop from subroutine without logical variable

以下最小示例:

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

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

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

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

您的方法违反了有关 'jumps' 范围的 Fortran 规则,无论它们是 exit 还是 goto 或类似结构。换句话说,您可以忘记 exit-ing 以您建议的方式从标记的 do-loop 中进行。

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

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

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