Просмотр полной версии : [Мануал] макрос на format + SendClientMessage
new format_string[128];
#define SendChatEx(%0,%1,%2,%3) format(format_string, sizeof(format_string),%2,%3) && SCM(%0, %1, format_string)
Создал такой макрос, где-то в недрах г-и увидел тему об крашах подобных ф-й, на сколько это правдиво и аргументировано? просто я с подобным не сталкивался чтобы макрос приводил к крашу сервера? Спасибо заранее. :blush2:
SteveStage
11.01.2020, 21:08
Можно сделать так:
#define SendChatEx(%0,%1,%2,%3) format(format_string,sizeof(format_string),%2,%3);SendClientMessage(%0,%1,format_string)
И это будет работоспособно (проверил), но лучше все таки создавать локальную переменную в месте использования, впрочем это уже совсем другая история.
Можно сделать так:
#define SendChatEx(%0,%1,%2,%3) format(format_string,sizeof(format_string),%2,%3);SendClientMessage(%0,%1,format_string)
И это будет работоспособно (проверил), но лучше все таки создавать локальную переменную в месте использования, впрочем это уже совсем другая история.
А чем ваш код отличается от моего?
Инклудом strlib воспользуйтесь и не тратьте время на макросы.
Kovshevoy
12.01.2020, 12:42
Держи готовую функу и не парь себе мозг.
stock SendClientMessageEx(playerid, color, const text[], {Float, _}:...)
{
static
args,
str[144];
/*
* Custom function that uses #emit to format variables into a string.
* This code is very fragile; touching any code here will cause crashing!
*/
if ((args = numargs()) == 3)
{
SendClientMessage(playerid, color, text);
}
else
{
while (--args >= 3)
{
#emit LCTRL 5
#emit LOAD.alt args
#emit SHL.C.alt 2
#emit ADD.C 12
#emit ADD
#emit LOAD.I
#emit PUSH.pri
}
#emit PUSH.S text
#emit PUSH.C 144
#emit PUSH.C str
#emit PUSH.S 8
#emit SYSREQ.C format
#emit LCTRL 5
#emit SCTRL 4
SendClientMessage(playerid, color, str);
#emit RETN
}
return 1;
}
Держи готовую функу и не парь себе мозг.
stock SendClientMessageEx(playerid, color, const text[], {Float, _}:...)
{
static
args,
str[144];
/*
* Custom function that uses #emit to format variables into a string.
* This code is very fragile; touching any code here will cause crashing!
*/
if ((args = numargs()) == 3)
{
SendClientMessage(playerid, color, text);
}
else
{
while (--args >= 3)
{
#emit LCTRL 5
#emit LOAD.alt args
#emit SHL.C.alt 2
#emit ADD.C 12
#emit ADD
#emit LOAD.I
#emit PUSH.pri
}
#emit PUSH.S text
#emit PUSH.C 144
#emit PUSH.C str
#emit PUSH.S 8
#emit SYSREQ.C format
#emit LCTRL 5
#emit SCTRL 4
SendClientMessage(playerid, color, str);
#emit RETN
}
return 1;
}
И лови краши при использовании crashdetect/схожих плагинов :3
А что мешает просто прописывать format и SendClientMessage вручную? Куда вы так спешите?
Kovshevoy
12.01.2020, 13:01
И лови краши при использовании crashdetect/схожих плагинов :3
А что мешает просто прописывать format и SendClientMessage вручную? Куда вы так спешите?
Докажи, что именно эта вариация функи вызывает краши)
Это не тот дефолт который везде предлагают.
Я юзал эту функу с модом на онлайне достаточное время и всё было отлично)
Если интересует мод, то South Central.
А вообще, так же не вижу смысла её использовать, вместо fmt + SCM. Шило на мыло как говорится.
Я все понимаю, но мой вопрос был касательно макроса а не велосипедов с функциями.
SteveStage
12.01.2020, 19:00
К слову, максимальная длина строки SendClientMessage - 144 символа +1 нуль-символ, а не 128
Kovshevoy
12.01.2020, 21:45
Я все понимаю, но мой вопрос был касательно макроса а не велосипедов с функциями.
Если тебя интересует крашит или нет, то скажу, что не крашит.
execution
13.01.2020, 09:41
Я все понимаю, но мой вопрос был касательно макроса а не велосипедов с функциями.
Дак ты делаешь велосипеды с макросами, какая разница? :blush2:
Outsider
18.11.2021, 05:14
Держи готовую функу и не парь себе мозг.
stock SendClientMessageEx(playerid, color, const text[], {Float, _}:...)
{
static
args,
str[144];
/*
* Custom function that uses #emit to format variables into a string.
* This code is very fragile; touching any code here will cause crashing!
*/
if ((args = numargs()) == 3)
{
SendClientMessage(playerid, color, text);
}
else
{
while (--args >= 3)
{
#emit LCTRL 5
#emit LOAD.alt args
#emit SHL.C.alt 2
#emit ADD.C 12
#emit ADD
#emit LOAD.I
#emit PUSH.pri
}
#emit PUSH.S text
#emit PUSH.C 144
#emit PUSH.C str
#emit PUSH.S 8
#emit SYSREQ.C format
#emit LCTRL 5
#emit SCTRL 4
SendClientMessage(playerid, color, str);
#emit RETN
}
return 1;
}
Мейби кто-нибудь подскажет, ибо туторов по этой штуке я не нашёл и ассемблер само собой не понимаю тем более... Если я хочу добавить функции ещё один параметр перед спредом, помимо цифры в цикле и условия, что-то ещё нужно поменять?
У меня получается интересный баг из-за этой функции, если я пытаюсь её изменить — OnPlayerText, возвращаемый 0, — начинает возвращать значение 1 (имею в виду срабатывает, хотя не должен).
- - - Добавлено - - -
Мейби кто-нибудь подскажет, ибо туторов по этой штуке я не нашёл и ассемблер само собой не понимаю тем более... Если я хочу добавить функции ещё один параметр перед спредом, помимо цифры в цикле и условия, что-то ещё нужно поменять?
У меня получается интересный баг из-за этой функции, если я пытаюсь её изменить — OnPlayerText, возвращаемый 0, — начинает возвращать значение 1 (имею в виду срабатывает, хотя не должен).
Не актуально. Кажется, разобрался.
Если честно не понимаю смысл данных макросов...
Это пожалуй явный пример бесполезных макросов и глупых.
На ровне с теми которые добавляют инородный синтаксис в код.
Использование подобных макросов может привести к тому, что Вы потратите намного больше, чем без них.
Вариант функции SendClientMessageEx очень сомнителен тем, что там используется оператор #emit, что усложняет дальнейшую поддержку кода, да ещё там делается то же самое, что можно сделать ручками. Это излишество, которое может привести к неправильной работе сервера в дальнейшем.
execution
22.09.2022, 13:36
Если честно не понимаю смысл данных макросов...
Это пожалуй явный пример бесполезных макросов и глупых.
На ровне с теми которые добавляют инородный синтаксис в код.
Использование подобных макросов может привести к тому, что Вы потратите намного больше, чем без них.
Вариант функции SendClientMessageEx очень сомнителен тем, что там используется оператор #emit, что усложняет дальнейшую поддержку кода, да ещё там делается то же самое, что можно сделать ручками. Это излишество, которое может привести к неправильной работе сервера в дальнейшем.
Ну вообще про сложность поддержки кода можно отнести абсолютно всё, с чем ты плохо знаком или плохо написано.
Данная функция не требует каких-то сторонних вмешательств, ибо они не зачем.
Что на счёт использование подобных трюков, это можно отнести, наверное, как синтаксическому сахару что-ли.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot