PDA

Просмотр полной версии : [Вопрос] Проблема sscanf



Mazzilla
22.06.2014, 22:21
Здравствуйте, уважаемые знатоки. Столкнулся с такой проблемой при использовании sscanf:
Имеется команда:

CMD:offban(playerid, params[])
{
if(GetPVarInt(playerid, "pAdmin") < 1) return MSG_NOADMIN(playerid);
if(sscanf(params, "s[24]i", params[0], params[1])) return SCM(playerid, COLOR_GREEN, "[USAGE]: /offban [nick-name] [days]");
SCM(playerid, -1, params[0]);
return true;
}
При вводе /offban Mazzilla 2 - такая ситуация в чате:
http://imgdepo.ru/id/i6876083
То есть, неправильная работа sscanf'a.
Мод new.pwn, sscanf обновлён до последней версии (http://forum.sa-mp.com/showthread.php?t=120356), zcmd, в остальных системах/командах sscanf работает исправно, даже с подобными типами параметров (команда /ban [nick-name] работает).
В чём может быть проблема и как её решить?

DeimoS
22.06.2014, 22:38
Это глюк с плагином. В нём сделана обработка массива params для возможности записывать в него данные любых значений (от чисел и до текста, как делаете вы), но если попробовать записать в params два (и более) текста по очереди:

sscanf(params, "s[24]s[50]", params[0], params[1])
Или же текст и число

sscanf(params, "s[24]i", params[0], params[1])
срабатыват какая-то ошибка в плагине и происходит своеобразная коллизия, которую вы и наблюдаете сейчас. Выход прост - если вы столкнулись с ситуациями, описанными выше, создавайте отдельные переменные и записывайте данные в них.

CMD:offban(playerid, params[])
{
if(GetPVarInt(playerid, "pAdmin") < 1) return MSG_NOADMIN(playerid);
new nick_name[MAX_PLAYER_NAME], ban_days;
if(sscanf(params, "s[24]i", nick_name, ban_days)) return SCM(playerid, COLOR_GREEN, "[USAGE]: /offban [nick-name] [days]");
SCM(playerid, -1, nick_name);
return true;
}

P.S. Функция SCM - зло. Вызывайте экзорциста

Mazzilla
22.06.2014, 22:58
Решил проблему именно таким же способом, который Вы посоветовали, но без ban_days (оставил params[1]).
Первый раз с таким столкнулся, теперь буду знать. Благодарю за отклик, scm 1 love. :dirol:

DeimoS
22.06.2014, 23:11
scm 1 love. :dirol:

Подключите Crashdetect. В 99% случаев он будет указывать вам на утечки данных именно в вашей любимой SCM. Да и работает она медленнее format. Но дело ваше