我正在将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等。
答案 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
} │ │