java中的Fortran GOTOs

93ze6v8z  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(292)

是的,我研究了在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

处理所有可能的GOTO的“标准”方法是什么?

ddrv8njm

ddrv8njm1#

处理此问题的最佳方法是将每个逻辑块组成一个部分,并为整个函数创建一个状态图。
别忘了,从一个状态开始时就已经过了,这被认为是一种过渡,应该这样对待。当您将这些分解为它们的状态转换时,您可以开始看到它们在哪里可以简化为几个函数,在必要时应用递归或迭代。
现在,我完全承认我不理解这个函数,也不知道它在做什么或应该做什么,但这是第一次尝试制作状态图,让你了解我的意思。注意80上的循环,可能需要一个循环。请注意,10和100是您唯一的返回状态。请注意,一旦你从30岁到50岁,就没有回头路了。这向我表明,50+可能是它自己的孤立函数,而10-40是它自身的函数,它有一个循环,当它达到30时,表示return functionRepresenting50Pluss(...)

请注意,某些状态转换上的填充方框表明,如果没有其他转换离开该状态,则保证选择该转换。注意,它在80上不存在,因为我不能确定80或90是它的保证目的地。有可能有什么东西会永远绕着80转?如果不了解更多的功能,我不能说。

bttbmeg0

bttbmeg02#

GOTO被认为是一种反模式。在不考虑重新设计代码的情况下,永远不要尝试将其直接转换为Java。
例如,当您看到GOTO的标签时,这可能是该代码将被重用的标志。它是否应该属于将来再次调用的方法?使用面向对象的方法进行新的设计,而不是使用与FORTRAN中相同的过程序列。
Java在没有GOTOs的情况下在现实世界中工作。

相关问题