OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 12 Ноябрь, 2019 06:44

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: Суббота, 15 Май, 2010 21:26 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 830
Откуда: Казань
Написал небольшой тестовый пример:
Код:
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 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2932
Откуда: г. Ярославль
Думаю, что дело в этом:

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Май, 2010 22:07 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2316
Откуда: Россия, Томск
Rifat писал(а):
Можете объяснить почему так?
Потому, что в Pr видна только глобальная переменная x, а все прочие присваивания производятся над локальными. Локальные переменные имеют приоритет, "перекрывают" одноимённые глобальные.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 07:40 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 830
Откуда: Казань
Получается что не все так просто с подпрограммами. И в общем случае следующее описание неверно:
"выполнение подпрограммы без формальных параметров дает тот же результат, что и выполнение составляющих его подпрограмму операторов, как если бы они были подставлены вместо оператора вызова подпрограммы".

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 07:59 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3108
Откуда: Астрахань
Насчет локальных переменных повелось с 60-х годов и не меняется. Практически во всех императивных языках - как написано выше в цитате.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 08:56 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2316
Откуда: Россия, Томск
Rifat писал(а):
"выполнение подпрограммы без формальных параметров дает тот же результат, что и выполнение составляющих его подпрограмму операторов, как если бы они были подставлены вместо оператора вызова подпрограммы".
Это не определение языка, это метафора для объяснения вызова процедуры. Её не следует понимать буквально, и вообще следует забыть после базового понимания.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 09:53 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1433
Rifat писал(а):
Получается что не все так просто с подпрограммами. И в общем случае следующее описание неверно:
"выполнение подпрограммы без формальных параметров дает тот же результат, что и выполнение составляющих его подпрограмму операторов, как если бы они были подставлены вместо оператора вызова подпрограммы".
Кто знает есть ли различия между Обероном и Компонентным Паскалем в обращении с локальными переменными?

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 10:54 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 11:07 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 14:34 

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Май, 2010 20:30 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3108
Откуда: Астрахань
Тут все просто. текст читается сверху вниз.
Все, что определено сверху - снизу видно. При входе в процедуру-функцию предпочтение отдается местным переменным (параметрам) с теми же именами. При выходе - обратно открываются "забаненные" на время наличия местного объекта.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Май, 2010 18:57 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1433
Валерий Лаптев писал(а):
Тут все просто. текст читается сверху вниз.
Все, что определено сверху - снизу видно. При входе в процедуру-функцию предпочтение отдается местным переменным (параметрам) с теми же именами. При выходе - обратно открываются "забаненные" на время наличия местного объекта.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 09:07 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3108
Откуда: Астрахань
У переменных опережающих объявлений не бывает. Бывает у классов, функций.
И почти всегда в таких случаях чего-то плохо продумано...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 18 Май, 2010 20:35 

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB