Loops 不带逻辑变量从子例程退出外部循环
以下是最简单的例子:Loops 不带逻辑变量从子例程退出外部循环,loops,module,fortran,exit,subroutine,Loops,Module,Fortran,Exit,Subroutine,以下是最简单的例子: 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 in
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情况,因此不知道如何将globle变量定义为标志并执行以下操作:
如果(something=.true.)exitvar=.true。
然后在每个子程序或函数后面写一个if case,如果变量为.true。或否,并逐步退出所有循环。
是否有其他方法可以在de模块中的单独子例程中从内部循环退出外部循环?您的方法违反了Fortran关于“跳转”范围的规则,无论是
exit
s还是goto
s或类似结构。换句话说,您可以忘记以您建议的方式退出标记的do循环
我会遇到各种错误,即使我将循环名称设置为全局字符Yes,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
是的,您现在必须测试子例程是否提前完成,但为了避免从一个作用域到另一个作用域的无约束跳跃所带来的疯狂,这是一个很小的代价。您的方法违反了Fortran关于“跳跃”作用域的规则,无论它们是
exit
s还是goto
s或类似的构造。换句话说,您可以忘记以您建议的方式退出标记的do循环
我会遇到各种错误,即使我将循环名称设置为全局字符Yes,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
是的,您现在必须测试子例程是否提前完成,但为了避免从一个作用域到另一个作用域的无约束跳跃所带来的疯狂,这是一个很小的代价。请注意,您需要
=
进行逻辑比较。还要注意(something=.true.)==(something)
,与.true.
的比较是多余的。@HighPerformanceMark也是非标准的。@IanH:D'ohhh,这当然也是。出于历史利益考虑,您过去可以通过另一种回报来实现这一点。谢天谢地,它被贬值了。请注意,逻辑比较需要=
。还要注意(something==.true。)==(something)
,与.true.
的比较是多余的。@HighPerformanceMark也是非标准的。@IanH:D'ohhh,当然,出于历史利益考虑,你过去可以通过另一种回报来实现这一点。谢天谢地,这已经贬值了。