Сложность с изменяемой областью применения Fortran - PullRequest
3 голосов
/ 21 июля 2009

Я инициализировал одну переменную в одной из функций Фортрана. Я использую это в другой функции. Но ценность не остается такой же. В другом вызове функции я получаю значение мусора. Как мне сохранить инициализированное значение.

Ex:

entry a()
num_calls=0

entry b()
num_calls= num_calls + 1

Из записи "b" я получаю num_calls как мусор

Ответы [ 4 ]

5 голосов
/ 21 июля 2009

В классическом Fortran (Fortran 77 или более ранней версии) вы должны убедиться, что num_calls определен в общем блоке - возможно, в названном общем блоке.

COMMON /magic/ num_calls

Я не использовал Фортран 90, поэтому я не знаю, какие у него дополнительные возможности. Вероятно, он сохраняет именованные общие блоки для обратной совместимости, но, вероятно, также предоставляет что-то лучшее.

Я тоже обманул и использовал неявное объявление переменной. В полном объеме я должен написать:

INTEGER*4 num_calls
COMMON /magic/ num_calls
4 голосов
/ 21 июля 2009

Для FORTRAN 77 будет работать метод Джонатана Леффлера - как он указывает, Fortran 90 и далее также поддерживает блоки COMMON. Однако, поскольку у вас есть доступ к компилятору Fortran 90 / Fortran 2003, нет смысла использовать блок COMMON - оставьте их в куче истории вместе с вычисленными GOTO и ENTRY.

Метод Fortran 90 для хранения группы связанных переменных (и функций) больше не является блоком COMMON, а MODULE. Для вашего кода это относительно просто:

module count_calls

    integer :: num_calls = 0

end module count_calls

Затем в подпрограммах, где вы хотите использовать num_calls, добавьте

use count_calls

либо к самим подпрограммам, либо к содержащей их области (то есть a program или другому module).

1 голос
/ 09 сентября 2011

Вы должны объявить переменную с атрибутом «save». Таким образом, переменная живет между вызовами. Есть опции компилятора, чтобы пометить все переменные как «сохранить», так как старые компиляторы делали это по умолчанию или в зависимости от уровня оптимизации.

    integer*4, save :: num_calls

Это стандартная функция большинства языков, когда локальные переменные становятся неопределенными, когда они выходят из области видимости.

1 голос
/ 21 июля 2009

Вам необходимо объявить num_calls вне любой подпрограммы, чтобы ее время жизни не было связано ни с одним из вызовов подпрограммы. Кто-то, кто на самом деле говорит на фортране, может предоставить вам пример кода ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...