将c for loop转换为fortran do循环

时间:2017-09-18 03:33:17

标签: c++ loops fortran

我正在将cpp prog(从另一位作者)转换为Fortran prog,我的C不是太强。我遇到了以

开头的for循环结构
for (int n = 1; 1; ++n) {
...

我原本希望按照

转换为Fortran Do.
Do n=1, 1, 2
...

......根据我对++ n将要做的事情的理解,至少这是我的猜测。

我的翻译是否正确?如果是这样,循环最多循环一次,所以我错过了什么???

据我所知,在某些方面,c for-loops具有“do-while”方面,因此皱纹移植到Fortran Do's。

无论如何......非常感谢澄清。

编辑:经过一些迅速的回应后,我想我知道这是怎么回事

首先,确切的C代码复制/粘贴,但“修剪”一点,是

    for (int n = 1; 1; ++n) {
      const double coef = exp(-a2*(n*n)) * expx2 / (a2*(n*n) + y*y);
      prod2ax *= exp2ax;
      prodm2ax *= expm2ax;
      sum1 += coef;
      sum2 += coef * prodm2ax;
      sum4 += (coef * prodm2ax) * (a*n);
      sum3 += coef * prod2ax;
      sum5 += (coef * prod2ax) * (a*n);
      // test convergence via sum5, since this sum has the slowest decay
      if ((coef * prod2ax) * (a*n) < relerr * sum5) break;
    }

所以是的,循环中有一个“中断”,在Fortran一侧被“退出”替换。

我认为关键似乎来自下面的答案,原始代码的作者创建了     for(int n = 1; 1; ++ n) 正是为了创建一个无限循环,我没想到这对于构造会创建一个无限循环。

无论如何,我当然可以在Fortran中创建一个带有“Exit”的无限循环(虽然我希望我可以更明智地“做”它)

非常感谢所有人。

格雷戈里先生的回答似乎是那个能够立即为我找到解决方案的回应,所以我会说出他的正确答案。至于Fortran方面,有许多替代方案,例如:

  Do While
    :
    If( something ) Exit
  End Do

但是老式的我可能会使用带有“限制”的构造,例如

   Do i=1, MaxIter
    :
    If( something ) Exit
   End Do

对于稍微更有趣的应用程序,我可能会包含一个返回标志,以防它没有收敛到MaxIter等。

5 个答案:

答案 0 :(得分:2)

如果没有看到C ++程序如何突破该循环,那么很难确定,但是直接的Fortran等价物将是

n = 1
do
    ! code, including an exit under some condition, presumably on the value of n
    n = n+1
end do

如果在n达到临界值时终止循环,那么等效值可能是

do n = 1, critical_value  ! no need to indicate step size if it is 1
    ! code
end do

答案 1 :(得分:1)

您确定正确编写了C代码吗?通常,C / C ++中的循环如下所示:

for (int n = 1; n < 10; ++n) {
    // ...
}

注意“n <10”测试条件。您的代码的测试条件只是1,它将始终评估为布尔值“true”。这意味着代码将无限循环,除非循环中有break,你没有显示。

++n表示“递增n”。

因此,如果您显示的代码确实正确,则FORTRAN等效代码为:

n = 1
do
    [Body of the loop, which you haven't shown]
    n = n + 1
enddo

答案 2 :(得分:0)

这是什么

for (int n = 1; 1; ++n)

确实

它将n设置为1,然后无限循环,在每次循环迭代结束时将n递增1。除非循环内的某些东西爆发,否则循环永远不会终止。

自从我编写Fortran以来已经有很长一段时间了,但是我记得你翻译它的do循环是不正确的。

答案 3 :(得分:0)

我认为你不能翻译

for (int n = 1; 1; ++n)

到FORTRAN DO循环。我记得,在C / C ++中通用条件的概念不能在FORTRAN DO循环中模拟。

相当于

Do n=1, 1, 2
C / C ++中的

for ( int n = 1; n <= 1; n += 2 ) 

答案 4 :(得分:0)

CareyGregory的回答除了一些注释。

++n表示'逐个递增n(在评估n之前)'

在C和C ++中,for循环有三个子句,与FORTRAN非常相似:

for (init; condition; increment)

不同之处在于每个子句必须是完整的表达式,而在FORTRAN中,子句只是值。它只是编写等效while循环的“简短”方式:

int n = 1;          │ for (int n = 1; 1; ++n)    │ n = 1
while (1)           │ {                          │ do 
{                   │   ...                      │   ...
  ...               │ }                          │   n = n + 1
  ++n;              │                            │ enddo
}                   │                            │