Использование sscanf
#1

Хотел перевести команды мода на более быстрые, с помощью zcmd+sscanf, но не хватает времени, ибо на перевод его нужно много, а я часто пишу обновления и получается нестыковка.

Придумал свое применение sscanf, хоть для какой-то оптимизации команд.

pawn Code:
else if(strcmp(cmd, "/warn", true) == 0)
    {
        if(PlayerInfo[playerid][pAdmin] < 2)return 1;
        if(dostup[playerid] != 1) return ShowPlayerDialog(playerid,2934,DIALOG_STYLE_INPUT,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n размером от 6 до 15 символов","Ок","Отмена");
        strdel(cmdtext,0,5);
        new reason[65];
        if(sscanf(cmdtext,"us",giveplayerid,reason))return SendClientMessage(playerid,-1, "::: Введите: /warn [id] [причина]");
        if(giveplayerid == INVALID_PLAYER_ID || !IsPlayerConnected(giveplayerid))return SendClientMessage(playerid,COLOR_GRAD1,"Игрок не найден");
        if(PlayerInfo[giveplayerid][pWarns] < 0) PlayerInfo[giveplayerid][pWarns] = 0;
        PlayerInfo[giveplayerid][pWarns] += 1;
        PlayerInfo[giveplayerid][pRp] -= 10;
        PlayerInfo[giveplayerid][pMember] = 0;
        PlayerInfo[giveplayerid][pLeader] = 0;
        PlayerInfo[giveplayerid][pJob] = 0;
        if(PlayerInfo[giveplayerid][pWarns] >= 3)
        {
            new ip[16];
            GetPlayerIp(giveplayerid,ip,16);
            format(string, sizeof(string), "Администратор %s забанил %s [3 предупреждения]. Причина: %s ", sendername,Name(giveplayerid), reason);
            SendClientMessageToAll(COLOR_LIGHTRED, string);
            format(string, sizeof(string), "- Ник: [%s] IP: [%s]",Name(giveplayerid),ip);
            SendAdminMessage(COLOR_LIGHTRED,string);
            PlayerInfo[giveplayerid][pLocked] = 1;
            Kick(giveplayerid);
            return 1;
        }
        format(string, sizeof(string), "Администратор %s выдал Warn %s. Причина: %s", sendername, Name(giveplayerid), reason);
        SendClientMessageToAll(COLOR_LIGHTRED,string);
        SendClientMessage(giveplayerid, COLOR_LIGHTRED, "- Для снятия Warna подайте заявку в личном меню /mm - [8] Доступ к игре");
        Kick(giveplayerid);
        return 1;
    }
Что именно изменил в коммандах (пример):

strdel(cmdtext,0,5);
if(sscanf(cmdtext,"us",giveplayerid,reason))return SendClientMessage(playerid,-1, "::: Введите: /warn [id] [причина]");


Это заменяет большой участок кода который использован сейчас у меня. Собственно... я удаляю текст команды и пробел после нее из cmdtext, а потом из него же, через sscanf извлекаю параметры.

Хочу узнать, стоит ли так делать? И не будет ли от этого только хуже?
Спасибо
Reply
#2

Хуже не будет, но и прироста скорости тоже не будет. Основной выигрыш идет от использования обработчика команд, а не от sscanf, sscanf это просто приятный сишный бонус. Потратьте время, запилите zcmd.
Reply
#3

Quote:
Originally Posted by eakwarp
View Post
Хуже не будет, но и прироста скорости тоже не будет. Основной выигрыш идет от использования обработчика команд, а не от sscanf, sscanf это просто приятный сишный бонус. Потратьте время, запилите zcmd.
Странно что нету "прироста". Просто мне казалось заменяя вот эту штуковину во всех командах где есть string, они станут быстрее работать. Я до сих пор не понял как она работает

pawn Code:
new length = strlen(cmdtext);
            while ((idx < length) && (cmdtext[idx] <= ' '))
            {
                idx++;
            }
            new offset = idx;
            new result[64];
            while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
            {
                result[idx - offset] = cmdtext[idx];
                idx++;
            }
            result[idx - offset] = EOS;
Reply
#4

Quote:
Originally Posted by stabker
View Post
Странно что нету "прироста". Просто мне казалось заменяя вот эту штуковину во всех командах где есть string, они станут быстрее работать. Я до сих пор не понял как она работает

pawn Code:
new length = strlen(cmdtext);
            while ((idx < length) && (cmdtext[idx] <= ' '))
            {
                idx++;
            }
            new offset = idx;
            new result[64];
            while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
            {
                result[idx - offset] = cmdtext[idx];
                idx++;
            }
            result[idx - offset] = EOS;
Вы понимаете что основной прирост, при изменении способа обработки, заключается в том, что серверу не нужно перебирать все проверки при каждом вводе команды в паблике онплееркоммандтекст? То что в самих командах, обрабатывается сугубо при их использовании, и по сути, здесь уже нагрузка крайне мала и совершенно не важна.
Reply
#5

Quote:
Originally Posted by stabker
View Post
Странно что нету "прироста". Просто мне казалось заменяя вот эту штуковину во всех командах где есть string, они станут быстрее работать. Я до сих пор не понял как она работает

pawn Code:
new length = strlen(cmdtext);
            while ((idx < length) && (cmdtext[idx] <= ' '))
            {
                idx++;
            }
            new offset = idx;
            new result[64];
            while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
            {
                result[idx - offset] = cmdtext[idx];
                idx++;
            }
            result[idx - offset] = EOS;
Этот дибильный костыль придуман(вырезан из strtok) авторами ГФ и до сих пор встречается в ГФ-подобном дерьме. Этот код нужно удалить и вместо result использовать cmdtext[idx].
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)