是的,我研究了在java中实现GOTO的各种方法,但这是现实世界:我需要一个最新的fortran LAPACK例程转换为java,请参阅http://www.netlib.org/lapack/timing/eig/eigsrc/dlasq3.f,例如:
10 CONTINUE
IF( N0.LT.I0 )
$ RETURN
IF( N0.EQ.I0 )
$ GO TO 20
NN = 4*N0 + PP
IF( N0.EQ.( I0+1 ) )
$ GO TO 40
OPS = OPS + DBLE( 3 )
IF( Z( NN-5 ).GT.TOL2*( SIGMA+Z( NN-3 ) ) .AND.
$ Z( NN-2*PP-4 ).GT.TOL2*Z( NN-7 ) )
$ GO TO 30
20 CONTINUE
fortran code ...
GO TO 10
30 CONTINUE
OPS = OPS + DBLE( 2 )
IF( Z( NN-9 ).GT.TOL2*SIGMA .AND.
$ Z( NN-2*PP-8 ).GT.TOL2*Z( NN-11 ) )
$ GO TO 50
40 CONTINUE
fortran code ...
GO TO 10
50 CONTINUE处理所有可能的GOTOs的“标准”方法是什么?
发布于 2011-10-21 08:09:09
GOTOs被认为是一种反模式。在不考虑重新设计代码的情况下,永远不要尝试将其直接转换为Java。
例如,当您看到GOTO的标签时,这很可能是此代码将被重用的标志。它是否应该属于将来要再次调用的方法?使用OO而不是使用与FORTRAN相同的过程序列来处理新的设计。
在没有GOTOs的情况下,Java确实可以在现实世界中工作。
发布于 2011-10-21 08:13:12
处理这种情况的最好方法是将每个逻辑块组成一个部分,并为整个函数制作一个状态图。
不要忘记,没有通过一个状态的开始被认为是一种转换,应该这样对待。当您将它们分解为状态转换时,您可以开始查看在哪里可以将它们简化为少数几个函数,并在必要时应用递归或迭代。
现在,我完全承认我不理解这个函数,或者它在做什么,或者它应该做什么,但这是第一次尝试制作状态图,让你对我的意思有一个概念。注意80上的循环,可能需要一个循环。请注意,10和100是唯一的返回状态。注意,一旦你从30岁到50岁,就没有回头路了。这向我表明,50+可能是它自己的独立函数,而10-40是它自己的函数,当它达到30时表示return functionRepresenting50Pluss(...)

只需注意,某些状态转换上填充的方框表明,如果没有其他转换远离该状态,则保证选择此转换。请注意,它不存在于80上,因为我不能真正确定80或90是它保证的目的地。有没有可能某个东西永远在80左右循环?如果对函数没有更多的了解,我就不能说了。
https://stackoverflow.com/questions/7843649
复制相似问题