从没有逻辑变量的子程序中退出外层循环
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
是的,您现在必须测试子例程是否提前完成,但这是一个很小的代价,可以避免从一个范围到另一个范围的无约束跳转所带来的疯狂。
以下最小示例:
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
是的,您现在必须测试子例程是否提前完成,但这是一个很小的代价,可以避免从一个范围到另一个范围的无约束跳转所带来的疯狂。