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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Я говорил о том, как в pawn можно использовать переменные с маркером (или есть какое-то название для таких слов, как public, stock, static?) public. Приводил свой пример с CallRemoteFunction (или CallLocalFunction, я не понимаю между ними разницы), который являлся не рабочим. Вы мне показали участок статьи с официальной документации pawn (с public связанный) и привели пример использования.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    В CallRemoteFunction не просто так есть слово "Function" в названии :)

    Публичные переменные в SA-MP не имеют особого применения.
    А какое применение у них вообще может быть, показано, собственно, в официальной документации.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Пошел так перебирать всю тему с начала, а чем по сути отличаются два этих кода?
    PHP код:
    const value 8
    и
    PHP код:
    new const value 3
    Во втором случае value помещается в память (я так полагаю сегментную память), а в первом - нет? Либо в первом случае это уже пойдет как функция?

    (дело в том, что в официальной документации есть такая строка: "To declare a constant variable, insert the keyword const between the key-word that starts the variable declaration —new, static, public or stock— and the variable name". Суть в том, (как я понял) что const необходимо указывать лишь после ключевых слов, "запускающих" объявление переменной (new, stock, public, static). Ну так ведь можно и без них обойтись...).

    И я так немного сравнил время работы с разными "маркерами" совместно с const. Наиболее быстро система работает с переменной, объявленной как
    PHP код:
    const value 8
    С другими же типами немного медленнее. Очень немного. Буквально 3-4 миллисекунды. Опять же, повторюсь, при миллионе итераций.
    PHP код:
    new const value 8;
    stock const value 8;
    public const 
    value 8
    Последний раз редактировалось Elrmrnt-Kritik; 17.03.2018 в 01:16.

  4. #14
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    (дело в том, что в официальной документации есть такая строка: "To declare a constant variable, insert the keyword const between the key-word that starts the variable declaration —new, static, public or stock— and the variable name". Суть в том, (как я понял) что const необходимо указывать лишь после ключевых слов, "запускающих" объявление переменной (new, stock, public, static). Ну так ведь можно и без них обойтись...).
    Не всегда.
    Попробуй, к примеру, объявить Float массив или переменную через const, не имея при этом перед ним new/static/stock/public, т.е. вот так:
    PHP код:
    const Float:array[] = {0.00.0, ...}; 
    или вот так:
    PHP код:
    const Float:var; 
    ...получишь ошибку.

    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    И я так немного сравнил время работы с разными "маркерами" совместно с const. Наиболее быстро система работает с переменной, объявленной как
    PHP код:
    const value 8
    С другими же типами немного медленнее. Очень немного. Буквально 3-4 миллисекунды. Опять же, повторюсь, при миллионе итераций.
    PHP код:
    new const value 8;
    stock const value 8;
    public const 
    value 8
    По скорости они скорее всего абсолютно одинаковые, а вся разница лишь в погрешностях.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    PHP код:
    const name 8
    Это именованная константа. По сути, то же самое, что и макрос. Но разница всё же есть:

    Макросы обрабатываются препроцессором. Препроцессор, при обработке макросов, просто ищет все совпадения в коде и заменяет их на значение. Это позволяет, например, изменять значение макроса или модифицировать его (парсеры как раз за счёт этого и пишутся).
    Константы же преобразуются уже самим компилятором. Как и в случае с макросами, на месте константы в байт-коде появится значение этой константы.

    Собственно, из этого и вытекают все различия, которые я покажу на примерах:
    PHP код:
    #define some_variable pro_pawn

    main()
    {
        new 
    some_variable;

    Если мы скомпилируем этот код, то в результате мы увидим такой варнинг:
    PHP код:
    warning 203symbol is never used"pro_pawn" 
    То есть, препроцессор не стал париться о том, что имя макроса совпало с именем переменной и просто переименовал её (собственно, потому что такое у макросов предназначение).

    В случае с константой
    PHP код:
    const some_variable 10;

    main()
    {
        new 
    some_variable;

    мы получим предупреждение о том, что указанное имя уже занято. То бишь, константы гораздо более защищены, как минимум, в том плане, что на указанное тобой значение заменится только то, что тебе нужно.

    Так же к константам применимо такое понятие, как "область видимости". То бишь, если ты создашь именованную константу в одном блоке кода, то ты уже не сможешь обратиться к ней из другого блока кода. Макросы же будут работать для всего кода, что будет после них, пока не встретит "#undef".

    Отсюда и область их применения разнится.


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





    PHP код:
    new const name 8
    Это уже переменная, защищённая от перезаписи (имеет все особенности переменной, но компилятор не позволит изменить её значение).
    Последний раз редактировалось DeimoS; 17.03.2018 в 19:21.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Коль уж вопросы начали затрагивать маркеры, а значит и виды памяти, наверное, было бы неплохо переименовать эту тему... Вообще, хотел узнать за декларирование функций (forward), потому что в интернете это расписано крайне... Даже не знаю как сказать, не то что бы сложно, просто непонятно зачем оно надо.

    Вот public делает переменную или функцию (дословно) общественной. Ну, будет к ней возможность обратиться из другого файла (ведь верно?). Это обращение осуществляется через CallRemoteFunction (для функций) и никак (серьезно? ) (для переменных). Я бы понял, если бы forward был нужен для того, чтобы в другом файле эта функция не была неизвестной. Но ведь forward суется не в этот файл, а в мод. А значит смысл от него каков?

    * под файлом выше я подразумевал какие-нибудь filterscripts.


    В одной из тем шла речь про суть public-функций. Мол, они дают о себе знать в некой хеш-таблице. А что это за таблица и где можно про нее получить конкретную информацию? В официальной документации есть об этом речь. Единственное полезное, что я понял оттуда - нежелательно создание "лишних" public-функций (не нужна - не делай), мол, большая хэш-таблица ухудшается в производительности, а потому работа с public-функциями будет уже медленнее. А вот, например, тот факт, что размер хэш-таблицы ограничен и при его исчерпании нужно увеличить этот самый размер, мне уже непонятен. Каким образом его можно менять и как получить общее представление о том, чему равен максимальный размер хэш-таблицы? Или он вообще в процессе работы сервера увеличивается сам, в зависимости от частоты вызова тех или иных функций. Была информация про функции, которые должны влиять на эту таблицу, но сами функции в игровом моде не работают (якобы символ не объявлен).
    Последний раз редактировалось Elrmrnt-Kritik; 14.04.2018 в 01:29.

  8. #17
    Аватар для SooBad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.04.2017
    Адрес
    Краснодар
    Сообщений
    83
    Репутация:
    20 ±
    Видимо, тема еще актуальна, раз конечного ответа автор публично так и не получил.

    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Коль уж вопросы начали затрагивать маркеры, а значит и виды памяти, наверное, было бы неплохо переименовать эту тему... Вообще, хотел узнать за декларирование функций (forward), потому что в интернете это расписано крайне... Даже не знаю как сказать, не то что бы сложно, просто непонятно зачем оно надо.
    По поводу forward: объявление forward для всех паблик-функций является обязательным условием. Это, своего рода, одно из правил языка.
    Вдаваться в подробности не имеет смысла, однако, если любопытство не перестает угнетать - можно прочитать подробности в P.I.G.

    Функцию следует делать публичной, в случае, если серверу требуется вызвать её во время выполнения. То бишь, далеко ходить не будем, это та же самая функция для таймеров, к примеру.

    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Вот public делает переменную или функцию (дословно) общественной. Ну, будет к ней возможность обратиться из другого файла (ведь верно?).
    Это обращение осуществляется через CallRemoteFunction (для функций) и никак (серьезно? ) (для переменных). Я бы понял, если бы forward был нужен для того, чтобы в другом файле эта функция не была неизвестной. Но ведь forward суется не в этот файл, а в мод. А значит смысл от него каков?
    Верно.
    CallRemoteFunction получает адрес для вызова нужной функции по индексу, посредством двоичного поиска в таблице паблик-функций, который, в свою очередь, хранится в префиксном сегменте памяти. Данный сегмент входит в конечно скомпилированный amx файл.
    Проспойлерю: forward как раз таки и связан с получением функцией определенного индекса.

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

    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    В одной из тем шла речь про суть public-функций. Мол, они дают о себе знать в некой хеш-таблице. А что это за таблица и где можно про нее получить конкретную информацию? В официальной документации есть об этом речь. Единственное полезное, что я понял оттуда - нежелательно создание "лишних" public-функций (не нужна - не делай), мол, большая хэш-таблица ухудшается в производительности, а потому работа с public-функциями будет уже медленнее. А вот, например, тот факт, что размер хэш-таблицы ограничен и при его исчерпании нужно увеличить этот самый размер, мне уже непонятен. Каким образом его можно менять и как получить общее представление о том, чему равен максимальный размер хэш-таблицы? Или он вообще в процессе работы сервера увеличивается сам, в зависимости от частоты вызова тех или иных функций. Была информация про функции, которые должны влиять на эту таблицу, но сами функции в игровом моде не работают (якобы символ не объявлен).
    Как я уже писал выше, эта таблица называется таблицей паблик-функций.
    Ограничений по кол-ву созданных функций публичного типа, как таковых, не предусмотрено, ибо секреция префиксов на свой макс.размер лимитов не имеет (в отличие от стеко-кучевого блока).

    Получение как таковых адресов тебе ничего не даст, ибо резервация в таблице паблик-функций происходит автоматически, посредством смещения к CIP от адреса последней функции (чтобы понять, что это такое, тебе стоит также почитать документацию к языку), а манипулировать адресами (то бишь делать переадресацию, либо дублировать функции, как в более расширенных языках), мы не можем.

    Насчёт скорости - да, это логично. Чем больше функций, тем дольше будет осуществляться двоичный поиск в их таблице.
    Последний раз редактировалось SooBad; 21.04.2018 в 03:00.

  9. Пользователь сказал cпасибо:
    Elrmrnt-Kritik (21.04.2018)
  10. #18
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Коль уж вопросы начали затрагивать маркеры, а значит и виды памяти, наверное, было бы неплохо переименовать эту тему... Вообще, хотел узнать за декларирование функций (forward), потому что в интернете это расписано крайне... Даже не знаю как сказать, не то что бы сложно, просто непонятно зачем оно надо.

    Вот public делает переменную или функцию (дословно) общественной. Ну, будет к ней возможность обратиться из другого файла (ведь верно?). Это обращение осуществляется через CallRemoteFunction (для функций) и никак (серьезно? ) (для переменных). Я бы понял, если бы forward был нужен для того, чтобы в другом файле эта функция не была неизвестной. Но ведь forward суется не в этот файл, а в мод. А значит смысл от него каков?

    * под файлом выше я подразумевал какие-нибудь filterscripts.


    В одной из тем шла речь про суть public-функций. Мол, они дают о себе знать в некой хеш-таблице. А что это за таблица и где можно про нее получить конкретную информацию? В официальной документации есть об этом речь. Единственное полезное, что я понял оттуда - нежелательно создание "лишних" public-функций (не нужна - не делай), мол, большая хэш-таблица ухудшается в производительности, а потому работа с public-функциями будет уже медленнее. А вот, например, тот факт, что размер хэш-таблицы ограничен и при его исчерпании нужно увеличить этот самый размер, мне уже непонятен. Каким образом его можно менять и как получить общее представление о том, чему равен максимальный размер хэш-таблицы? Или он вообще в процессе работы сервера увеличивается сам, в зависимости от частоты вызова тех или иных функций. Была информация про функции, которые должны влиять на эту таблицу, но сами функции в игровом моде не работают (якобы символ не объявлен).
    Очень кратко:

    Спецификатор forward необходим для декларирования всех функций. Тем не менее в функциях со спецификатором stock немного другая схема работы: он требует forward-декларацию только тогда, когда функция возвращает значение с определённым тегом.

    Функции, объявленные с помощью спецификатора public являются публичным. Их названия хранятся в скомпилированном AMX файле (названия других функций там не хранится).

    Это не хеш-таблица, а обычная отсортированная таблица (это весьма очевидно, ведь используется бинарный поиск). При использовании большого количества таких функций произойдёт "раздувание" файла, то есть его размера. Если бы была таблица, то доступ к элементу занимал O(1), а не O(log n) при бинарном поиске.

    Вообще можно поменять размер блока (реаллацировать), хранящего байт-код, но это будет странно, ведь это вовсе не нужно. Тем более, придётся перехватить функцию загрузки AMX-скриптов.


    Получение как таковых адресов тебе ничего не даст, ибо резервация в таблице паблик-функций происходит автоматически, посредством смещения к CIP от адреса последней функции (чтобы понять, что это такое, тебе стоит также почитать документацию к языку), а манипулировать адресами (то бишь делать переадресацию, либо дублировать функции, как в более расширенных языках), мы не можем.
    Странно, как тогда устроен YSI? Да, там хаки, но работает ж... =)

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

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Очень рад, что тема не оказалась незамеченной, спасибо большое вам.

    Цитата Сообщение от SooBad Посмотреть сообщение
    Мы не можем обратиться к определенной переменной из другого скрипта потому, что переменные находятся
    совершенно в других секрециях памяти (в стеке и куче), которые, в свою очередь, не включены в конечный файл.
    Ну, я имею в виду такое:
    1. public variable;

    Ведь это как и функции с маркером public, они же должны попадать в одну и ту же память (и, как я понимаю, сегментную).

    И, если честно, из двух ответов я так и не уловил суть forward'a. Я знаю когда его нужно делать и где, я не знаю какую именно роль он выполняет...

  13. #20
    Аватар для SooBad
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.04.2017
    Адрес
    Краснодар
    Сообщений
    83
    Репутация:
    20 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    И, если честно, из двух ответов я так и не уловил суть forward'a. Я знаю когда его нужно делать и где, я не знаю какую именно роль он выполняет...
    Вообще, декларирование осуществляется, чтобы узнать необходимый размер памяти при создании определенного объекта (переменной, функции и т.п.). В Pawn же, объявление декларирования для функций осуществляется вручную, в отличие от переменных.

    Если свестись к конкретному определению, то forward - это, своего рода, прототип функции, после обработки которого, компилятор позволяет ссылаться на функцию во всех частях скрипта (и за его пределами).
    Последний раз редактировалось SooBad; 21.04.2018 в 21:42.

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

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

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

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

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

Ваши права

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