Фортран ГОТО в Яве - PullRequest
       4

Фортран ГОТО в Яве

4 голосов
/ 21 октября 2011

Да, я рассмотрел различные способы реализации GOTO в Java, но вот реальный мир: мне нужна одна из последних программ 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?

Ответы [ 2 ]

6 голосов
/ 21 октября 2011

Лучший способ справиться с этим - составить каждый логический блок как раздел и создать диаграмму состояний для всей функции.

Не забывайте, что падение после начала состояния считаетсяпереход и должны рассматриваться как таковые.Когда вы разбили их на переходы состояний, вы можете начать видеть, где они могут быть сведены к нескольким функциям, при необходимости применяя рекурсию или итерацию.

Теперь я полностью признаю, что непонять функцию или то, что она делает или должна делать, но это была первая попытка составить диаграмму состояний, чтобы дать вам представление о том, что я имею в виду.Обратите внимание на цикл на 80, вероятно, понадобится цикл.Обратите внимание, что 10 и 100 - ваши единственные возвращаемые состояния.Обратите внимание на то, что когда вы идете от 30 до 50, пути назад уже нет.Это указывает на то, что 50+ может быть его собственной изолированной функцией, в то время как 10-40 - это ее собственная функция с циклом, который при достижении 30 говорит: return functionRepresenting50Pluss(...)

http://i51.tinypic.com/otkbqr.png

Простопримечание: заполненные квадраты на некоторых переходах состояния указывают, что этот переход гарантированно будет выбран, если никакой другой переход не сделан из состояния.Обратите внимание, что его нет на 80, потому что я не мог решить, 80 или 90, это гарантированный пункт назначения.Может быть, что-то может зацикливаться на 80?Без понимания функции я больше не могу сказать.

3 голосов
/ 21 октября 2011

GOTO считаются антишаблоном.Никогда не пытайтесь преобразовать его прямо в Java, не задумываясь о переделке кода.

Например, когда вы видите метку для GOTO, это, вероятно, признак того, что этот код будет использоваться повторно.Должен ли он принадлежать методу, который будет вызываться снова в будущем?Подходите к новому дизайну, используя ОО, а не ту же процедурную последовательность, что и в Фортране.

Java работает в реальном мире без GOTO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...