Bonjour à tous,
Mes excuses d'avance pour ce post qui va etre un peu long, mais le problème que je rencontre n'est pas simple à expliquer.
Voila, je reprends en ce moment un ancien code en Fortran 77 pour le compléter avec de nouvelles fonctions. Avant cela, j'ai entrepris de le dépoussiérer un peu, et en particulier d'accorder un soin particulier aux declarations de variables, qui étaient toutes faites de manière implicite...
Le programme consiste à effectuer des calculs à l'intérieur d'une boucle principale, et d'écrire les résultats dans un fichier de sortie à chaque itération.
Au niveau de la console, le programme est "silencieux" , mis à part qques messages qui signalent que tout se passe bien.
A l'éxécution, TOUT SE PASSE EFFECTIVEMENT BIEN (les valeurs obtenues en fin de calcul sont vérifées par un moyen parallèle), j'insiste particulièrement sur ce point qui est important pour la suite.
OR, lorsque j'ouvre mon fichier de sortie j'obtiens ceci :
Je n'ai mis que les 5 première itérations, mais ca continue comme ca jusqu'au bout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 N OBJ TOT MAX OBJ TOT MIN OBJ TOT MOY 0 0.500300E+01 0.407003E-05 0.773183E+00 1 NaN NaN NaN 2 NaN NaN NaN 3 NaN NaN NaN 4 NaN NaN NaN 5 NaN NaN NaN
La ou ca commence à devenir étrange, c'est que les valeurs affichées sont issues de la variable "object_tot" qui est utilisée telle quelle dans les calculs aux itérations suivantes, donc CE NE SONT PAS DES "VRAIS" NaN, puisque le calcul aboutit normalement. Cela est de plus confirmé par le fait que j'écris un autre fichier de sortie ou la variable "object_tot" est utilisée , et la les valeurs sont correctes.
Malgré cela, j'ai entrepris, par des WRITE(*,*) successifs, de "pister" l'endroit ou se produit le problème jusqu'à une sous-routine un peu en amont. Mais la le plus étrange se produit :
Si, à l'intérieur de cette sous-routine, j'écris (pop_size etant la logical size de object_tot):
Alors j'obtiens des valeurs correctes pour object_tot, ET LE FICHIER DE SORTIE AFFICHE LES BONNES VALEURS!!!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DO i=1,pop_size WRITE(*,*) object_tot(i) END DO
Autrement dit, un simple "write" de la variable qui pose problème corrige le problème, sans qu'aucune modification portant sur le fonctionnement du code n'ait été réalisée...
Au final, tout se passe comme si, auniveau interne, les valeurs avaient la bonne valeur (puisque la calcul aboutit normalement), mais que des qu'il s'agit d'affichage (console ou fichier) alors le comportement devient chaotique.
Vous comprendrez que cet effet "magique" rend le debuggage assez complexe...
Un dernier détail :
J'ai déjà rencontré ce problème avec une autre variable, qui, comme "object_tot", est un tableau déclaré avec la taille "pop_size_max" (fixée par une déclaration de type PARAMETER), alors que sa taille "reelle" au cours du calcul est pop_size. Je l'avais alors résolu en veillant à initialiser cette variable à 0 jusqu'à pop_size_max, et non jusqu'à pop_size, ce qui était le cas avant. Mais la meme vérification appliquée à ma variable "object_tot" n'a pas eu ici le meme effet.
DONC : je m'adresse à vous afin de recueillir vos ipressions sur le sujet, et en particulier, savoir si l'un d'entre vous avait déjà rencontré ce phénomène.
Sinon, qqn aurait-il une idée de quelle aberration de Fortran pourrait en etre la cause?
Pour l'instant, je vais garder la version avec sortie de la variable sur console pour pouvoir continuer à avancer, mais lorsque je devrai rendre le projet, il faudra que tout cela soit "propre", donc merci d'avance pour vos réponses.
Partager