Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 10 из 25
  1. #1
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±

    Использование static, const

    Доброе время суток. Такой вот вопрос наметился у меня... В каких случаях лучше использовать static (либо static const) вместо new; const вместо макроса?

    Ранее я static использовал только в тех случаях, когда переменная нужна лишь внутри одной функции, но при этом должна сохранять свое значение на глобальном уровне. Например:
    Код:
    #define MAX_PLAYERS_LENGTH 4//если вдруг изменится предел игроков, везде 4 менять не в прикол
    public OnPlayerConnect(playerid)
    {
    	static MAX_ONLINE;
    	if(Iter_Count(Player) > MAX_ONLINE)
    		MAX_ONLINE++;
    	
    	new string[57+(-2+MAX_PLAYERS_LENGTH)+1];
    	format(string, sizeof(string), "Новый рекорд! На сервере сегодня максимум было %d игроков", MAX_ONLINE);
    	SendClientMessageToAll(-1, string);
    }
    Часто замечаю использование static и в простых участках кода, где он, казалось бы, не нужен. Назревает вопрос: когда его лучше использовать, а также в каких случаях им не стоит злоупотреблять. И аналогично хотелось бы узнать за const... Почему бы везде пишут
    Код:
    #define MAX_HOUSES 100
    Когда ничего не мешает сделать
    Код:
    const MAX_HOUSES = 100;
    Либо же вообще что-то подобное:
    Код:
    stock FuncName(arg1, arg2, const arg3) return 1;//неважно что возвращает
    Последний раз редактировалось Elrmrnt-Kritik; 07.03.2018 в 17:28.

  2. #2
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    static - можно применять во включаемых файлах (include), область видимости этой переменной будет ограничена файлом, т.е. если в моде объявить переменную с таким же именем что и в файле, то при компиляции, не будет ошибки в виде:
    error 021: symbol already defined:

    const - (лат. constanta — постоянная, неизменная) позволяет создавать переменные, значение которых в дальнейшем нельзя изменить а-ля дериктива define

    static const - тоже что и просто const, но опять же, позволяет ограничить область видимости в пределах файла, и избежать появления предупреждения:
    warning 201: redefinition of constant/macro

    На счет stock, не думаю что будет правильно, макрос != функция, под макрос не нужно будет выполнять такие же операции как в случае с функцией (Выделение ячеек под адрес функции, + выдеялется под аргументы в ней, и т.п. не думаю что будет интересно знать), в случае макроса таких действий вроде как нет.
    Последний раз редактировалось Long-; 07.03.2018 в 18:25.

  3. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (08.03.2018)
  4. #3
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Цитата Сообщение от Long- Посмотреть сообщение
    static - можно применять во включаемых файлах (include), область видимости этой переменной будет ограничена файлом, т.е. если в моде объявить переменную с таким же именем что и в файле, то при компиляции, не будет ошибки в виде:
    error 021: symbol already defined
    Ах, да, совсем забыл еще про это написать)) Буквально месяц назад читал за перехваты функций, много чего изменил в своем моде. И при создании этих самых перехватов как раз и закрепил навык работы со статиком.


    const - (лат. constanta — постоянная, неизменная) позволяет создавать переменные, значение которых в дальнейшем нельзя изменить а-ля дериктива define
    Но ведь по сути и в процессе работы сервера нельзя менять значение макроса. Так что не вижу разницы между const и define.


    На счет stock, не думаю что будет правильно, макрос != функция, под макрос не нужно будет выполнять такие же операции как в случае с функцией
    Вопрос здесь уже был в том, когда в аргументах стоит использовать const. Здесь макросы уже не при делах.



    И насчет неинтересно знать... Поверьте, мне интересная любая информация. Я хочу и пытаюсь получить новые знания. Не только на практике, но и в теории, конечно.
    Последний раз редактировалось Elrmrnt-Kritik; 07.03.2018 в 22:45.

  5. #4
    Аватар для Long-
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.11.2016
    Сообщений
    131
    Репутация:
    23 ±
    Но ведь по сути и в процессе работы сервера нельзя менять значение макроса. Так что не вижу разницы между const и define.
    Разницы по сути и нет.

    Вопрос здесь уже был в том, когда в аргументах стоит использовать const. Здесь макросы уже не при делах.
    А, я подумал что лучше использовать функцию или макрос.
    Const юзают для того чтобы в функции нельзя было изменить значения аргумента логично же, не?
    Вроде бы, на сколько я знаю это делать от читеров, собейтов и т.п.

  6. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (10.03.2018)
  7. #5
    Аватар для DeimoS
    Модератор?

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

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


    Касаемо вопроса автора. Вот тут описано отличие static от new. Наличие const, как я уже написал выше, сигнализирует лишь о том, что переменная не должна изменяться.


    Касаемо const и define. Всё же не стоит путать тёплое с мягким :) Это два совершенно разных оператора с разными назначениями, которые лишь слегка пересекаются между собой. И даже в пересечении, на самом деле, мало общего. Поясняю.

    Когда мы говорим о константе, типа:
    PHP код:
    const test 1
    это мы говорим о символьной константе, которая и правда будет идентична макросу "#define test 1"
    Но если мы объявим переменную, используя оператор const
    PHP код:
    new const test 1;
    new const 
    test[3] = {1, ...};
    public const 
    test 1;
    public const 
    test[3] = {1, ...};
    static const 
    test 1;
    static const 
    test[3] = {1, ...};
    stock const test 1;
    stock const test[3] = {1, ...}; 
    То тут мы уже получим именно переменную, которая будет иметь свойства, которые зависят от указанного ключевого слова + свойство const (её значение не получится изменить).


    UPD: если вдруг напутал с определениями (ну, например, назвал оператором то, что не является оператором), то, думаю, меня поправят знающие люди (я любитель путать подобные вещи)
    Последний раз редактировалось DeimoS; 09.03.2018 в 16:37.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (10.03.2018)
  9. #6
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    описано отличие static от new.
    Я достаточно хорошо понимаю принцип работы этих двух операторов. Вот, например. Зачем здесь static? Точно также можно бы было использовать и new.

    А еще меньше понятна ситуация, когда в начале мода что-либо объявляют через static. Ведь эта переменная и так будет создана до завершения работы сервера...

    И да, один Ваш пример можно разобрать?
    PHP код:
    public const test 1
    stock еще слышал, чтобы не было предупреждений на неиспользованную переменную, а public? Зачем он в данном случае?
    Последний раз редактировалось Elrmrnt-Kritik; 10.03.2018 в 00:50.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Вот, например. Зачем здесь static? Точно также можно бы было использовать и new.
    Ну так ты читал пост Daniel Cortez, ссылку на который я кинул выше?
    static там нужен, чтоб массив поместить в сегмент данных, а не в стэк. Если сделать через new, он мало того, что всякий раз будет по новой инициализироваться, так ещё и текст, который ты указал в массиве, всё равно будет помещён в сегмент данных (то бишь, ты всё так же будешь работать с сегментом данных, но, перед этим, копируя эти данные в стэк. А со static ты сразу с сегментом данных работаешь напрямую)

    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    А еще меньше понятна ситуация, когда в начале мода что-либо объявляют через static. Ведь эта переменная и так будет создана до завершения работы сервера...
    И всё же ты не читал пост Daniel Cortez =\ Там есть ответ на твой вопрос


    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    И да, один Ваш пример можно разобрать?
    PHP код:
    public const test 1
    stock еще слышал, чтобы не было предупреждений на неиспользованную переменную, а public? Зачем он в данном случае?
    Лучше не "слушай" где попало и что попало, а загляни в официальную документацию и прочитай предназначение каждого оператора
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Последний раз редактировалось DeimoS; 14.03.2018 в 12:30.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  11. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (10.03.2018)
  12. #8
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Лучше не "слушай" где попало и что попало, а загляни в официальную документацию и прочитай предназначение каждого оператора
    Не стал пока что читать абсолютно все, отложил это на лето, однако, прочитал за процесс компиляции и за stock, public, static. Ну, сказать честно, вопросов стало больше, но это нормально

    Так по сути stock, public и static - своеобразные маркеры? А функции по большому счету объявляются так:
    PHP код:
    funcname() return ...; 

  13. #9
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    А Ваши ответы по моей проблеме можно назад?)

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

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

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

    Steve Pavlina

  15. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (12.03.2018)
 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

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

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

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

Ваши права

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