Русское сообщество по скриптингу

Возвращай функции или как передать значение

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Возвращай функции или как передать значение

Сообщение ko22009 » 03 фев 2017, 18:09

В этой статье расскажу вам о том, что необходимо и где необходимо возвращать значения.

Чего мы точно знаем, так это то, что возвращать напрямую строку нельзя в pawn. Нужно создавать переменную массив и потом возвращать ее. Так как в первом случае у нас строка принимает вид динамического массива. И поэтому у нас при компиляции вылетает компилятор с ошибкой. И потом, если вы и вернете массив, то он будет хранится локально, в теле функции.
Здесь есть конечно выход, создать глобальную переменную, либо передать массив в параметрах функции и изменить его.

Онлайн компилятор кода: Вы должны зарегистрироваться, чтобы видеть ссылки.

Пример передачи значения через глобальную переменную
Код: Выделить всё

new g_myVariable
[36];

public my_function()
{
   new str[] = "what's up!"
   g_myVariable = str;
}


Пример передачи значения через параметр
Код: Выделить всё

public func_call
()
{
   new str[64];
   my_function(str);
}

public my_function(str[64])
{
   str = "what's up!";
}
 

В результате в функции func_call переменная получит значение "what's up!"

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

Коды возврата функций мы можем найти в файле amxconst.inc, если мы работаем с основным движком.
Для "fakemeta функций" есть свое константы.

Итак, какие константы мы можем возвращать. В файле amxconst.inc находим:
#define PLUGIN_CONTINUE 0 /* Results returned by public functions */
#define PLUGIN_HANDLED 1 /* stop other plugins */
#define PLUGIN_HANDLED_MAIN 2 /* to use in client_command(), continue all plugins but stop the command */

Так, так, что это значит. С помощью #define мы определили константы и присвоили им значения. Во время компиляции компилятор заменяет в тех местах где находятся константы на эти значения. Это нужно для того, чтобы было проще воспринимать.

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

Например, если мы возвращаем функцию со значение PLUGIN_CONTINUE, то управление перейдет дальше от этой функции. Если PLUGIN_HANDLED, то остановимся на данной функции и дальше не пойдем.

Пример с вызовом команды через register_clcmd("say /cmd", "some_function");
В функции some_function если мы укажем PLUGIN_CONTINUE, то при вводе в чат команды "/cmd", мы увидим то, что написали в чате. Если укажем PLUGIN_HANDLED, то не выведется. В этом примере мы просто блокируем дальнейшее исполнении, мы с помощью функции register_clcmd отловили команду в игре, которая означает печатать в общий чат, фразу "/cmd".

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

Удачных вам возвратов! Будут вопросы, пишите, найдем ответ :-)
Последний раз редактировалось ko22009 03 фев 2017, 23:11, всего редактировалось 2 раз(а).
Аватара пользователя
ko22009
 
Сообщения: 131
Зарегистрирован: 19 янв 2017, 16:20
Благодарил (а): 12 раз.
Поблагодарили: 27 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
C++
Php
Python
C#

Re: Возвращай функции или как передать значение

Сообщение Mistrick » 03 фев 2017, 18:36

Можно так вернуть строку. Только это не особо продуктивно. На стеке будет копию возвращаемой строки всегда создавать.
Код: Выделить всё
#include <amxmodx>

public plugin_init()
{
    new str[12];
    str = get_my_str();
    server_print(str);
}
get_my_str()
{
    new str[12];
    str = "hello"
    return str;
}
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)


Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3