PDA

Просмотр полной версии : [Урок] Области видимости в языке pawn



NewGreen
29.09.2014, 15:24
Здравствуйте,

Это мой первый пост на данном форуме, и я хотел бы чтобы он был максимально полезным.
Я хочу рассказать Вам о такой простой и одновременно интересной вещи, как область видимости в языках программирования.
В pawn как и во многих других языках программирования существуют области видимости, благодаря которым мы можем определить "границы" переменных или функций.

Что такое область видимости
Область видимости задает то, какие переменные и функции видны другим частям программы/мода, также область видимости определяет продолжительность существования переменных и функций, и обозначается фигурными скобками "{ }".

Как мы знаем в pawn существуют два вида переменных, глобальные и локальные

Глобальные - объявляются вне области видимости функций, т.е. в глобальной области видимости, они видны для всех функций во всем коде.
Локальные - объявляются в локальной области т.е. внутри функций.

Приведу пример


new global; // Глобальная переменная
public OnPlayerConnect(playerid) {
new local = playerid; // Локальная переменная
global = playerid; // Глобальная переменная
}
public OnPlayerDisconnect(playerid) {
local = playerid; // Вот в этом месте будет ошибка
global = playerid; // Глобальная переменная
}


Почему в функции OnPlayerDisconnect появляется ошибка ?
Все просто, функция OnPlayerDisconnect ничего не знает о существовании переменной local т.к. она является локальной, и действует лишь в пределах области видимости функции OnPlayerConnect.

Еще одно важное замечание
Глобальные переменные создаются один раз и существуют все время пока существует глобальная область видимости!
Локальные переменные создаются каждый раз при входе в область видимости, и уничтожаются при выходе из нее!

Проверим так ли это


for(new i = 0; i < 10; i++) {
new j = i * 5; // Локальную переменная создается каждый раз при входе в область видимости цикла
print(j);
}


Как это работает ?
При каждом такте цикла, цикл проверяет условие i < 10 и пока условие истинно цикл входит в свою область видимости 10 раз (или n-1 раз), и столько же раз выходит из нее, в следствии чего переменная j создается 10 раз и уничтожается 10 раз, при этом функция print просто вызывается, но не уничтожается.

Подтверждение
Чтобы удостовериться в том что переменные действительно уничтожаются попробуйте скомпилировать следующий код:


stock TestAccess() {
new var = 0;
for(new i = 0; i < 10; i++) {
new loc = i * 5;
var = i * 10;
print(loc);
}
loc = 0; // Ошибка
}


Почему появилась эта ошибка ?
Переменная loc определена в области видимости цикла, и видна лишь в области видимости цикла, но функция TestAccess() ничего не знает об этой переменной, поэтому возникает ошибка error 017: undefined symbol "loc"
При этом переменная var может спокойно использоваться в области видимости цикла, т.к. она определена в за пределами области видимости цикла, в момент вызова функции TestAccess() в области видимости будет созданы все необходимые данные, а после они будут уничтожены.

Запомните!
Глобальные функции существуют весь период существования глобальной области видимости.
Локальные переменные создаются в момент входа в область видимости, и уничтожаются после выхода из нее.
После вызова функции, данные определенные в области видимости функции также уничтожаются

Заключение
Области видимости очень удобная вещь, надеюсь, что сегодня я смог объяснить Вам, эту простую но очень важную тему.

Спасибо за внимание!

Автор: NewGreen

Использованная литература:
Г. Шилдт | С++ Базовый курс