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

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

    Глобальный или локальный массив?

    Здравствуйте. Как лучше, создать глобальный массив и не парится с создаванием новых массивов или же лучше создавать каждый раз новый массив для форматирования?

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Инициализируя локальные массивы, ты не создаёшь новые массивы, а лишь резервируешь память стэка.
    Стэк можно представить как один большой массив. Когда ты создаёшь переменную, нужное число из стэка "закрепляется" за этой переменной. Никакой новой памяти не выделяется.
    А вот создавая глобальный массив, ты именно выделяешь новую память.

    Хотя дело даже не в выделении или не выделении памяти, а в том, что с глобальным массивом повышается шанс допустить ошибку.
    Например, у тебя есть код, в котором идёт работа с глобальным массивом и результат выдаётся в чат.
    new gString[3000];
    PHP код:
    CMD:commandname(playeridparams[])
    {
        
    //...
        
    format(gStringsizeof(gString), "Текст");
        
    SendClientMessage(playerid, -1gString);
        return 
    1;


    Тебе нужно написать похожий код, но только работать с локальным массивом или данными, переданными в параметре функции. Ты копируешь первый код, заменяешь глобальную переменную на локальную, но в одном месте (например, выводе сообщения в чат) ты не замечаешь эту самую глобальную переменную и не заменяешь её на локальную
    PHP код:
    public OnPlayerText(playeridtext[]);
    {
        
    //...
        
    new string[MAX_CHATBUBBLE_LENGTH+1];
        
    format(stringsizeof(string), "Текст");
        
    SendClientMessage(playerid, -1gString);//Вот тут забыл поменять
        
    return 0;

    Компилятор не выдаст никаких ошибок, так как функция gString существует для той строки, где мы забыли её заменить. Но вот код уже не будет работать так, как нужно. И тебе придётся тратить дополнительное время на то, чтоб обнаружить причину, по которой не выдаётся сообщение.

    А вот с локальными переменными такого не случится, ибо компилятор выплюнет ошибку и баг будет досрочно исправлен.


    Собственно, во всех случаях, когда локальная переменная уместна - используй именно её.




    UPD: Так как автор темы поставил "Спасибо" и больше никто не отписался, закрою тему и перемещу в ахив. Если вдруг у кого-то есть что добавить касаемо данного вопроса, можете отписать в личку и я открою тему
    Последний раз редактировалось DeimoS; 31.03.2018 в 12:56.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. 2 пользователя(ей) сказали cпасибо:
    Danny Marcelo (14.05.2020) geneff (30.03.2018)
 

 

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

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

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

Ваши права

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