OberonCore
https://forum.oberoncore.ru/

Области видимости локальных переменных
https://forum.oberoncore.ru/viewtopic.php?f=29&t=2644
Страница 1 из 1

Автор:  Rifat [ Суббота, 15 Май, 2010 21:26 ]
Заголовок сообщения:  Области видимости локальных переменных

Написал небольшой тестовый пример:
Код:
MODULE MyTest3;

   IMPORT Log;
   
   VAR x: INTEGER;

   PROCEDURE Do*;
      PROCEDURE Pr;
      BEGIN
         Log.Int(x); Log.Ln;
      END Pr;
      PROCEDURE A(p: INTEGER);
      VAR x: INTEGER;
         PROCEDURE B;
         VAR x: INTEGER;
         BEGIN
            x := 3;
            Pr;
         END B;
      BEGIN
         x := 2;
         IF p = 1 THEN Pr ELSE B END;
      END A;
   BEGIN
      A(2);
      A(1);
      Pr;
   END Do;

BEGIN
   x := 1;
END MyTest3.

Ожидалось что выведется:
3
2
1
А выводится:
1
1
1
Можете объяснить почему так?

Автор:  Иван Кузьмицкий [ Суббота, 15 Май, 2010 22:04 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Думаю, что дело в этом:

Цитата:
Область видимости объекта x текстуально распространяется от точки его описания до конца блока (модуля, процедуры или записи), к которому принадлежит описание и по отношению к которому объект, таким образом, считается локальным. Из этой области исключаются области видимости объектов с таким же именем, описанных в блоках, вложенных в данный.

Автор:  Александр Ильин [ Суббота, 15 Май, 2010 22:07 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Rifat писал(а):
Можете объяснить почему так?
Потому, что в Pr видна только глобальная переменная x, а все прочие присваивания производятся над локальными. Локальные переменные имеют приоритет, "перекрывают" одноимённые глобальные.

В противном случае к локальной переменной x невозможно было бы обратиться при наличии глобальной с тем же именем, а её объявление должно было бы считаться ошибкой, как и любой другой дублирующийся идентификатор.

Автор:  Rifat [ Воскресенье, 16 Май, 2010 07:40 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Получается что не все так просто с подпрограммами. И в общем случае следующее описание неверно:
"выполнение подпрограммы без формальных параметров дает тот же результат, что и выполнение составляющих его подпрограмму операторов, как если бы они были подставлены вместо оператора вызова подпрограммы".

Кто знает есть ли различия между Обероном и Компонентным Паскалем в обращении с локальными переменными?

Автор:  Валерий Лаптев [ Воскресенье, 16 Май, 2010 07:59 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Насчет локальных переменных повелось с 60-х годов и не меняется. Практически во всех императивных языках - как написано выше в цитате.

Автор:  Александр Ильин [ Воскресенье, 16 Май, 2010 08:56 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Rifat писал(а):
"выполнение подпрограммы без формальных параметров дает тот же результат, что и выполнение составляющих его подпрограмму операторов, как если бы они были подставлены вместо оператора вызова подпрограммы".
Это не определение языка, это метафора для объяснения вызова процедуры. Её не следует понимать буквально, и вообще следует забыть после базового понимания.

"Вершей пользуются при ловле рыбы. Поймав рыбу, забывают про вершу. Ловушкой пользуются при ловле зайцев. Поймав зайца, забывают про ловушку. Словами пользуются для выражения смысла. Постигнув смысл, забывают про слова". Источник.

Автор:  Wlad [ Воскресенье, 16 Май, 2010 09:53 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Rifat писал(а):
Получается что не все так просто с подпрограммами. И в общем случае следующее описание неверно:
"выполнение подпрограммы без формальных параметров дает тот же результат, что и выполнение составляющих его подпрограмму операторов, как если бы они были подставлены вместо оператора вызова подпрограммы".
Кто знает есть ли различия между Обероном и Компонентным Паскалем в обращении с локальными переменными?

разницы нет, и тот и другой подразумевают выполнение на железе, в котором для предоставления контекста исполнимой сущности используется отдельный блок(участок,зона,раздел) памяти. обычно (в большинстве решений по средам поддержки исполнения языков высокого уровня) это - СТЕК.

представьте(нарисуйте) себе манипуляции со стеком при входе/выходе из процедуры и ВСЕ ваши проблемы с непониманием адресации к конкретным переменным растаят, как снег по весне.

Автор:  igor [ Воскресенье, 16 Май, 2010 10:54 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Wlad2 писал(а):
представьте(нарисуйте) себе манипуляции со стеком при входе/выходе из процедуры и ВСЕ ваши проблемы с непониманием адресации к конкретным переменным растаят, как снег по весне.
В этом нет острой необходимости. Виртовские языки определены без привязки к какому-либо вычилительному механизму. Но в любом случае упражнение, которое Вы предлагаете, будет весьма полезно.

Автор:  igor [ Воскресенье, 16 Май, 2010 11:07 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Rifat писал(а):
Можете объяснить почему так?
Подсказка: Процедура Pr, которая манипулирует глобальной переменной x, ничего не знает о существовании одноимённой локальной переменной в процедурах A и B.
Другое дело, если бы эти локальные переменные x были бы переданы в процедуру Pr (при её вызове) в виде параметра :wink: .

Автор:  Wlad [ Воскресенье, 16 Май, 2010 14:34 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

igor писал(а):
Wlad2 писал(а):
представьте(нарисуйте) себе манипуляции со стеком при входе/выходе из процедуры и ВСЕ ваши проблемы с непониманием адресации к конкретным переменным растаят, как снег по весне.
В этом нет острой необходимости. Виртовские языки определены без привязки к какому-либо вычилительному механизму.

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

Автор:  Валерий Лаптев [ Воскресенье, 16 Май, 2010 20:30 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Тут все просто. текст читается сверху вниз.
Все, что определено сверху - снизу видно. При входе в процедуру-функцию предпочтение отдается местным переменным (параметрам) с теми же именами. При выходе - обратно открываются "забаненные" на время наличия местного объекта.

Автор:  Wlad [ Понедельник, 17 Май, 2010 18:57 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Валерий Лаптев писал(а):
Тут все просто. текст читается сверху вниз.
Все, что определено сверху - снизу видно. При входе в процедуру-функцию предпочтение отдается местным переменным (параметрам) с теми же именами. При выходе - обратно открываются "забаненные" на время наличия местного объекта.

... + опережающие объявления. забыли?...

Автор:  Валерий Лаптев [ Вторник, 18 Май, 2010 09:07 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

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

Автор:  Wlad [ Вторник, 18 Май, 2010 20:35 ]
Заголовок сообщения:  Re: Области видимости локальных переменных

Валерий Лаптев писал(а):
У переменных опережающих объявлений не бывает.
SIC ! , однако... таки - вы озвучили один из ключевых моментов мыканий народа в 60-х по видам передачи информации о видимости "объектов" между контекстами исполнений. :lol:

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/