Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Область видимости идентификаторов




 

Область действия (scope) идентификатора есть часть пространства программы, в котором он доступен для использования.

Обычно область действия идентификатора начинается там, где он объявлен, а заканчивается там где это объявление теряет силу.

Большинство переменных являются локальными. Их область видимости – блок кода, в котором они объявлены. Рассмотрим программу на листинге 2.1. (На этом листинге показан модуль, текст которого сгенерирован Delphi.)

 

 

Листинг 2.1. SCOPEU.PAS.

 

01: unit ScopeU;

02:

03: interface

04:

05: uses

06: Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

08:

09: type

10: TForm1 = class(TForm)

11: Button1: TButton;

12: Memo1: TMemo;

13: procedure Button1Click(Sender: TObject);

14: procedure FormCreate(Sender: TObject);

15: private

16: { Private declarations }

17: public

18: { Public declarations }

19: end;

20:

21: var

22: Form1: TForm1;

23:

24: implementation

25:

26: var

27: X: Integer;

29: {$R *.DFM}

30:

31: procedure TForm1.Button1Click(Sender: TObject);

32: var

33: X: Integer;

34:

35: procedure Test;

36: var

37: X: Integer;

38: begin

39: X:= 300;

40: {Здесь переменная X имеет значение 300. }

41: Memo1.Lines.Add(`Локальная функция X: ` + IntToStr(X));

42: end;

43:

44: begin

45: X:= 100;

46: Memo1.Lines.Clear;

47: { Локальная переменная X имеет значение 100. }

48: Memo1.Lines.Add(`Локальная X: ` + IntToStr(X));

49: { Глобальная переменная X имеет значение 200. }

50: Memo1.Lines.Add(`Глобальная X: ` + IntToStr(ScopeU.X));

51: { Вызываем процедуру Test. }

52: Test;

53: end;

54:

55: procedure TForm1.FormCreate(Sender: TObject);

56: begin

57: { Инициализируем переменную модуля X. }

58: X:= 200;

59: end;

60:

61: end.

 

Прежде всего отметим то, что переменная X объявлена в трех местах этой программы. Она объявлена в строке 27 в разделе реализации, затем в строке 33 (метод Button1Click), наконец – в строке 37 (в локальной процедуре с именем Test). Если объявление переменной встречается дважды, компилятор фиксирует ошибку «Identifier redeclared: 'X'», а компиляция прекращается. Но эта программа прекрасно работает. Почему? Потому, что каждая из переменных с именем X в этом листинге имеет свою облась действия.

Посмотрите на листинг 2.1 внимательней. В строке 37 переменная X объявлена внутри локальной процедуры Test и «видима» только в блоке кода этой процедуры. (Здесь мы несколько забежали вперед, говоря о локальных процедурах и функциях. Необходимые разъяснения будут даны ниже в разделе «Локальные функции и процедуры»). Вне процедуры Test переменная X, которая объявлена в строке 37, не существует. Эта переменная имеет локальную область действия. Точно так же объявление переменной X на строке 33 является локальным по отношению к методу Button1Click. Вне этого метода переменная, объявленная в строке 33, не существует. (Если бы в процедуре Test не было объявления Х в строке 37, то она изменяла бы значение переменной Х, объявленной в строке 33!!!).

Теперь рассмотрим область действия переменной X, объявленной в разделе implementation. Эта переменная видима из любого места модуля. Раз так, то она «видна» и в методе Button1Click. Но в этом методе переменная Х объявляется дважды. Возникает вопрос, а какое же из трех объявлений переменной Х должно использоваться? Ответ: действует локальное объявление в методе Button1Click, и локальное объявление в процедуре Test. Иными словами, действует то объявление, которое «ближе к телу».

Итак, переменная X, которая объявлена в разделе implementation модуля, доступна всюду в этом модуле. Локальная переменная с таким же именем «главнее» переменной модуля. Но что если внутри метода Button1Click нам понадобится переменная модуля, а не локальная? В этом случае переменную модуля необходимо квалифицировать. Строка 50 листинга 2.1 содержит:

 

Memo1.Lines.Add(¢Global X: ¢ + IntToStr(ScopeU.X));

 

Нетрудно видеть, что квалификатором переменной X является имя модуля (ScopeU). Квалификация переменной именем модуля буквально означает «Дайте мне переменную X модуля, а не локальную переменную X». Символом присоединения квалификатора является точка (.).

Как было сказано выше, переменная X, объявленная в разделе implementation, доступна в любом месте модуля. Если необходимо чтобы переменная была доступной в других модулях, ее объявление следует разместить в разделе interface. (На листинге 2.1 такой переменной является Form1). Любая переменная, объявленная в разделе interface доступна в любом модуле проекта. Такие переменные часто называют глобальными. Чтобы сделать глобальные переменные, объявленные в некотором модуле, достаточно добавит этот модуль с список uses. Если в двух разных модулях объявлены переменные с одинаковыми именами, для исключения неоднозначности надо применять квалификаторы так, как это показано выше.

 

 

ПРИМЕЧАНИЕ. На самом деле, определение глобальной переменной не совсем корректно. Действительно, переменные из раздела интерфейса модуля становятся доступны только после того как соответствующее имя появится в списке uses. Использовать такие переменные автоматически мы не можем. Истинно глобальной является только такая переменная, которая доступна всегда, везде и без ссылок на модули в списке uses. Delphi имеет несколько стандартных глобальных переменных, но мы не можем создавать такие переменные.

 

 




Поделиться с друзьями:


Дата добавления: 2015-04-29; Просмотров: 468; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.