Являются ли локальные переменные в Fortran 77 статическими или динамическими? - PullRequest
8 голосов
/ 06 апреля 2010

Для моего класса языков программирования одна проблема hw спрашивает:

Являются ли локальные переменные в Фортране статическими или динамическими в стеке? Являются ли локальные переменные, ИНИЦИАЛИЗИРОВАННЫЕ до значения по умолчанию, статическими или динамическими в стеке? Покажите мне код с объяснением, чтобы поддержать ваш ответ. Подсказка: самый простой способ проверить это - заставить вашу программу проверить чувствительность истории подпрограммы. Посмотрите, что происходит, когда вы инициализируете локальную переменную значением, а когда нет. Возможно, вам потребуется вызвать более одной подпрограммы, чтобы с уверенностью зафиксировать ваш ответ.

Я написал несколько подпрограмм: - создать переменную - выведите переменную - инициализировать переменную значением - напечатать переменную снова

Каждый последующий вызов подпрограммы выводит одно и то же случайное значение для переменной, когда она не инициализирована, а затем выводит инициализированное значение.

Что это за случайное значение, когда переменная неинициализирована?

Означает ли это, что Fortran использует одну и ту же ячейку памяти для каждого вызова подпрограммы или динамически создает пространство и случайным образом инициализирует переменную?

Моя вторая подпрограмма также создает переменную, но затем вызывает первую подпрограмму. Результат тот же, за исключением того, что случайное число, напечатанное из неинициализированной переменной, отличается. Я очень смущен. Пожалуйста, помогите!

Большое спасибо.

Ответы [ 2 ]

13 голосов
/ 06 апреля 2010

В Fortran 77 и 90/95/2003, если вы хотите, чтобы значение переменной local для подпрограммы сохранялось при вызовах подпрограмм, вы должны объявить его атрибутом «save», например, (используя стиль Fortran 90):

integer, save :: counter

OR

integer :: counter
save :: counter

. Или, если вы хотите, чтобы поведение «сохранения» применялось ко всем переменным, просто включите в подпрограмму простой

save

оператор без каких-либо переменных. В Fortran 90 инициализация переменной в объявлении

integer :: counter = 0

автоматически получает атрибут сохранения. Я не думаю, что это было в Фортране 77.

Это одна из областей, в которой эксперименты могут вводить в заблуждение - они расскажут вам о том, что делает конкретный компилятор, но, возможно, не о том, что собой представляет языковой стандарт Fortran 77, или о том, что сделали другие компиляторы. Многие старые компиляторы Fortran 77 не помещали локальные переменные в стек и неявно все переменные имели атрибут save, без программирования, использовавшего это объявление. Это, например, имело место с популярными компиляторами DEC Fortran. Унаследованные программы на Fortran 77, которые использовались только с определенным компилятором этого типа, часто работают со сбоями с современным компилятором, потому что программисты забыли использовать атрибут save для переменных, которые в нем нуждались. Первоначально это не вызывало проблем, потому что все переменные эффективно имели атрибут save. Большинство современных компиляторов помещают локальные переменные без сохранения в стек, и эти программы часто работают со сбоями, потому что некоторые переменные, которые требуют «сохранения», «забывают» свои значения при вызовах подпрограмм. Это можно исправить, идентифицировав проблемные переменные и добавив save (work), добавив оператор save к каждой подпрограмме (меньше работы), или у многих компиляторов есть опция (например, -fno-automatic в gfortran) для восстановления старого поведения ( легко).

Это кажется странным вопросом - вы не узнаете о «Фортране 77», а о конкретном компиляторе. И зачем использовать Фортран 77 вместо Фортрана 95/2003? Есть ли проф. думаете Фортран остановился в 1977 году?

5 голосов
/ 06 апреля 2010

Чтобы подчеркнуть один момент, сделанный @MSB,

Стандарты Fortran не сообщают авторам компиляторов, как реализовать стандарты, они касаются поведения программ, видимых программисту.Таким образом, ответ на вопрос «все зависит от компилятора».И OP не сообщает нам, какой компилятор (-ы) он использует.

Более того, если вы пробежитесь сквозь туманы времени, чтобы изучить все когда-либо написанные компиляторы FORTRAN77, я уверен, что вынайдите множество различных реализаций интересующих вас функций, многие из которых связаны с довольно эзотерической аппаратной архитектурой.

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