是的,我研究了在java中实现GOTO的各种方法,但这是现实世界: 我需要一个最新的fortran LAPACK例程转换为java, 看到 http://www.netlib.org/lapack/timing/eig/eigsrc/dlasq3.f e.g:
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
处理所有可能的GOTO的“标准”方式是什么?
答案 0 :(得分:6)
处理此问题的最佳方法是将每个逻辑块组合为一个部分,并为整个函数制作状态图。
不要忘记,经过一个国家的开始,堕落被认为是过渡,应该这样对待。当你将它们分解为状态转换时,你可以开始看到它们可以被简化为少数几个函数,在必要时应用递归或迭代。
现在,我完全承认我不理解这个功能或它正在做什么或应该做什么,但这是制作状态图的第一次尝试,让你知道我的意思。注意80
上的循环,可能需要一个循环。请注意,10和100是您唯一的返回状态。请注意,一旦你从30岁到50岁,就不会再回头了。这向我表明50+可能是它自己的孤立函数,而10-40是它自己的函数,有一个循环,当它达到30时说return functionRepresenting50Pluss(...)
http://i51.tinypic.com/otkbqr.png
只需注意,某些状态转换上的填充正方形表示如果没有其他转换离开状态,则保证选择此转换。注意它在80上不存在,因为我无法确定80或90是否是它的保证目的地。它可能是永远在80左右循环的东西吗?我不能不理解这个功能。
答案 1 :(得分:3)
GOTO被认为是一种反模式。在不考虑重新设计代码的情况下,不应该尝试将其直接转换为Java。
例如,当您看到GOTO的标签时,这可能表示此代码将被重用。它应该属于将来再次调用的方法吗?使用OO来处理新设计,而不是使用与FORTRAN中相同的程序序列。
Java在没有GOTO的情况下可以在现实世界中运行。