Je convertis un cpp prog (d'un autre auteur) en un prog Fortran, mon C n'est pas trop fort. Je suis tombé sur des constructions en boucle pour en commençant parconvertir c pour boucle à fortran faire boucle
for (int n = 1; 1; ++n) {
...
Je me serais attendu à ce à convertir en Fortran Do selon
Do n=1, 1, 2
...
... au moins c'est mon estimation basée sur ma compréhension ce que ++ n fera.
Ma traduction est-elle correcte? Si c'est le cas, la boucle fera un cycle au plus une fois, alors qu'est-ce qui me manque ???
Je comprends que, à certains égards, les boucles for-c ont un aspect «do-while», et donc des rides de portage à Fortran Do.
De toute façon ... une précision serait très appréciée.
ÉDITÉE: après quelques réponses rapides, et je pense que je vois où cela va
D'abord, le code exact C copier/coller mais « couper » un peu, est
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;
}
Alors oui , il y a une "pause" dans la boucle, qui du côté Fortran est remplacée par une "Sortie".
Je pense que la clé semble être des réponses ci-dessous que l'auteur du code d'origine a créé le for (int n = 1; 1; ++ n) précisément pour créer une boucle infinie, et je ne l'avais pas deviné que cela pour construire créerait une boucle infinie.
Quoi qu'il en soit, je peux certainement créer une boucle infinie avec une « sortie » en Fortran (bien que je pense que je pourrais « faire » un peu plus judicieusement)
Un grand merci à tous.
Il semble que la réponse de M. Gregory a été celle qui a immédiatement conduit à une solution pour moi, donc je vais marquer son correct. Pour ce qui est du côté Fortran, il y a un certain nombre d'alternatives telles que:
Do While
:
If(something) Exit
End Do
mais étant vieux jeu, je serais probablement utiliser une construction avec une « limite », comme
Do i=1, MaxIter
:
If(something) Exit
End Do
Pour les applications un peu plus fantaisistes Je pourrais inclure un drapeau de retour au cas où il n'a pas convergé dans etc. de maxiter
qui Fortran? Fortran77, Fortran95, Fortran2005? Et quel C++? C++ 11? BTW, pourquoi le convertis-tu? Appeler du code C++ de Fortran pourrait être plus simple que de le convertir! –