Локальные переменные в Фортране являются 77 статическими или складывают динамичный?

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

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

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

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

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

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

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

Огромное спасибо.

8
задан mm2887 6 April 2010 в 03:00
поделиться

2 ответа

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

integer, save :: counter

ИЛИ

integer :: counter
save :: counter

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

save

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

integer :: counter = 0

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

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

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

12
ответ дан 5 December 2019 в 10:02
поделиться

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

Стандарты Fortran не сообщают разработчикам компиляторов, как реализовать стандарты, они озабочены поведение программ видно программисту. Итак, ответ на вопрос: «все зависит от компилятора». И OP не сообщает нам, какие компиляторы он использует.

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

5
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: