2009-07-21 8 views
3

J'ai initialisé une variable dans l'une des fonctions Fortran. Je l'utilise dans une autre fonction. Mais la valeur n'est pas restée la même. Dans l'autre appel de fonction je reçois la valeur de poubelle. Comment puis-je maintenir la valeur initialisée.Difficulté avec la variable variable fortran

Ex:

 
entry a() 
num_calls=0 

entry b() 
num_calls= num_calls + 1 

De l'entrée « b » Je reçois num_calls comme des ordures

+0

Num_calls est-il localement ou globalement étendu? – outis

Répondre

1

Vous devez déclarer num_calls extérieur de chaque sous-programme pour que sa durée de vie est sans rapport avec une ou l'autre appel de sous-programme. Quelqu'un qui parle réellement FORTRAN peut vous fournir un exemple de code ...

5

En Fortran classique (Fortran 77 ou antérieur), vous devez vous assurer que num_calls est défini dans un bloc commun - probablement un bloc commun nommé.

COMMON /magic/ num_calls 

Je n'ai pas utilisé Fortran 90, donc je ne sais pas ce que des services supplémentaires dont il dispose. Il conserve probablement des blocs communs nommés pour la rétrocompatibilité, mais fournit probablement quelque chose de mieux aussi.

J'ai aussi triché et utilisé une déclaration implicite de la variable. En plein, je devrais écrire:

INTEGER*4 num_calls 
COMMON /magic/ num_calls 
4

Pour FORTRAN 77, la méthode de Jonathan Leffler travaillera - comme il le souligne, Fortran 90 et en avant prend également en charge COMMON blocs. Cependant, puisque vous avez accès à un compilateur Fortran 90/Fortran 2003, il n'y a aucune raison d'utiliser un bloc COMMON - laissez-les dans le tas de cendres de l'histoire avec GOTO et ENTRY.

La méthode Fortran 90 pour stocker un groupe de variables (et de fonctions) associées n'est plus le bloc COMMON mais un MODULE. Pour votre code, ce qui est relativement simple:

module count_calls 

    integer :: num_calls = 0 

end module count_calls 

Ensuite, dans vos sous-routines où vous souhaitez utiliser num_calls, ajouter

use count_calls 

soit aux sous-routines eux-mêmes ou la portée contenant (soit un program ou un autre module).

1

Vous devez déclarer la variable avec l'attribut "save". De cette façon, la variable vit entre les appels. Il y a des options de compilateur pour marquer toutes les variables comme "save" puisque les anciens compilateurs l'ont fait par défaut ou en fonction du niveau d'optimisation.

integer*4, save :: num_calls 

Il est une caractéristique standard de la plupart des langues que les variables locales vont undefined quand ils sont hors de portée.

+0

Cependant, la plupart des compilateurs FORTRAN historiques ont alloué le local dans une zone statique plutôt que sur la pile, rendant l'instruction save facultative et encourageant les mauvaises pratiques ... –

Questions connexes