Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 1 из 1
  1. #1
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±

    Области видимости в языке pawn

    Здравствуйте,

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

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

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

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

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

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

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

    Проверим так ли это
    PHP код:
    for(new 010i++) {
        new 
    5// Локальную переменная создается каждый раз при входе в область видимости цикла
        
    print(j);

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

    Подтверждение
    Чтобы удостовериться в том что переменные действительно уничтожаются попробуйте скомпилировать следующий код:
    PHP код:
    stock TestAccess() {
        new var = 
    0;
        for(new 
    010i++) {
            new 
    loc 5;
            var = 
    10;
            print(
    loc);
        }
        
    loc 0// Ошибка

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

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

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

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

    Автор: NewGreen

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

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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