【问题标题】:Converting a Go-to statement from FORTRAN 77 to Fortran 90将 Go-to 语句从 FORTRAN 77 转换为 Fortran 90
【发布时间】:2015-07-24 18:01:17
【问题描述】:

我正在处理一段遗留的 F77 代码并尝试对其进行转换 到等效的 F90 代码。我在下面遇到了这些行,可以 有人建议我的转换是否正确?

Fortran 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

谁能告诉我这种方法是否正确?在我的结果中,我没有得到我期望的结果。所以我的逻辑可能有问题。

【问题讨论】:

  • 如果你努力使一些代码现代化,请使用一些缩进,否则我看不出翻译有什么意义。
  • 还有一点值得注意:已经是F90码了。
  • 为确保没有遗漏,您应该提及修改ab的语句,以使if语句最终得到.true.;您可以在示例代码中插入类似 do some computations 的内容

标签: if-statement fortran fortran90 fortran77 do-loops


【解决方案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

【讨论】:

  • 谢谢 Vogt,让我试试这个。但是,我想知道那个“if”语句没有“else”条件。如果陈述为假会发生什么?
  • 如果语句的计算结果为 FALSE,则循环将继续下一次迭代,直到达到其限制(在本例中为 10 次迭代)。
猜你喜欢
  • 2023-03-27
  • 2013-06-27
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多