Чего мы точно знаем, так это то, что возвращать напрямую строку нельзя в 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).
Удачных вам возвратов! Будут вопросы, пишите, найдем ответ