Преобразование оператора Go-to из FORTRAN 77 в Fortran 90

Я работаю над частью устаревшего кода F77 и пытаюсь преобразовать его в эквивалентный код F90. Я столкнулся с этими строками ниже, и может ли кто-нибудь посоветовать, правильно ли мое преобразование?

Код Фортран 77:

Subroutine area(x,y,z,d)
do 15 j=1,10
if (a.gt.b) go to 20
15 CONTINUE
20 Statement 1
   Statement 2
   Statement 3
end subroutine

Я попытался преобразовать его в F90 и получил следующее:

Subroutine area(x,y,z,d)
  dloop: do j=1,10
    if (a>b) then 
      statement 1
      statement 2
      statement 3
    else
      write(*,*) 'Exiting dloop'
      exit dloop
    end if
  end do dloop
end subroutine

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


person Nerdy business    schedule 24.07.2015    source источник
comment
Пожалуйста, если вы постараетесь модернизировать какой-то код, используйте отступы, иначе не вижу смысла заморачиваться с переводом.   -  person Vladimir F    schedule 24.07.2015
comment
Также стоит отметить: это уже код F90.   -  person francescalus    schedule 24.07.2015
comment
Чтобы убедиться, что ничего не упущено, вы должны упомянуть операторы, которые изменяют a или b, чтобы оператор if в конечном итоге получил .true.; Вы можете вставить что-то вроде do some computations в свой пример кода.   -  person innoSPG    schedule 24.07.2015


Ответы (1)


Вы немного ошиблись в переводе... Первый шаг — перестроить цикл do, который зацикливается на 15:

Subroutine area(x,y,z,d)
do j=1,10
  if (a.gt.b) go to 20
enddo
20 Statement 1
   Statement 2
   Statement 3
end subroutine

Теперь вы можете видеть, что goto приводит к "выпрыгиванию из цикла". В данном конкретном примере это эквивалентно exit, и код можно записать как

Subroutine area(x,y,z,d)
  do j=1,10
    if (a.gt.b) exit
  enddo
  Statement 1
  Statement 2
  Statement 3
end subroutine
person Alexander Vogt    schedule 24.07.2015
comment
Спасибо Фогт, позвольте мне попробовать это. Однако мне интересно, что в этом утверждении «если» нет условия «еще». Что произойдет, если утверждение будет ложным? - person Nerdy business; 25.07.2015
comment
Если оператор оценивается как FALSE, цикл будет продолжаться со следующей итерацией, пока не будет достигнут предел (в данном случае 10 итераций). - person chw21; 25.07.2015