Вход

Просмотр полной версии : [Мануал] макрос на format + SendClientMessage



R1KO
11.01.2020, 18:04
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)

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

R1KO
12.01.2020, 02:50
Можно сделать так:

#define SendChatEx(%0,%1,%2,%3) format(format_string,sizeof(format_string),%2,%3);SendClientMessage(%0,%1,format_string)

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

А чем ваш код отличается от моего?

red.inc
12.01.2020, 10:21
Инклудом 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;
}

DeimoS
12.01.2020, 12:48
Держи готовую функу и не парь себе мозг.

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. Шило на мыло как говорится.

R1KO
12.01.2020, 15:41
Я все понимаю, но мой вопрос был касательно макроса а не велосипедов с функциями.

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 (имею в виду срабатывает, хотя не должен).

Не актуально. Кажется, разобрался.

shierru
17.09.2022, 21:41
Если честно не понимаю смысл данных макросов...

Это пожалуй явный пример бесполезных макросов и глупых.
На ровне с теми которые добавляют инородный синтаксис в код.

Использование подобных макросов может привести к тому, что Вы потратите намного больше, чем без них.
Вариант функции SendClientMessageEx очень сомнителен тем, что там используется оператор #emit, что усложняет дальнейшую поддержку кода, да ещё там делается то же самое, что можно сделать ручками. Это излишество, которое может привести к неправильной работе сервера в дальнейшем.

execution
22.09.2022, 13:36
Если честно не понимаю смысл данных макросов...

Это пожалуй явный пример бесполезных макросов и глупых.
На ровне с теми которые добавляют инородный синтаксис в код.

Использование подобных макросов может привести к тому, что Вы потратите намного больше, чем без них.
Вариант функции SendClientMessageEx очень сомнителен тем, что там используется оператор #emit, что усложняет дальнейшую поддержку кода, да ещё там делается то же самое, что можно сделать ручками. Это излишество, которое может привести к неправильной работе сервера в дальнейшем.

Ну вообще про сложность поддержки кода можно отнести абсолютно всё, с чем ты плохо знаком или плохо написано.
Данная функция не требует каких-то сторонних вмешательств, ибо они не зачем.

Что на счёт использование подобных трюков, это можно отнести, наверное, как синтаксическому сахару что-ли.