PDA

Просмотр полной версии : [Вопрос] Возможно ли оптимизировать данный код?



Desulaid
20.03.2015, 18:28
Написал я диалог авторизации(впервые в жизни :3) и мне код показался громоздким, вопрос, "оптимизировать возможно и что именно тут надо переписывать?"



case 2:
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT,"Авторизация","{FFFFFF}Вы не можете продолжить авторизацию не введя пароль!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
for(new i = strlen(inputtext)-1; i != -1; i--)
{
switch(inputtext[i])
{
case '0'..'9', 'a'..'z', 'A'..'Z': continue;
default: return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", "{FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
}
}
if(!strcmp(pInfo[playerid][pPassword], inputtext))
{
new query_string[52+MAX_PLAYER_NAME];
format(query_string, sizeof(query_string), "SELECT * FROM `gamers` WHERE `name` = '%s'", pInfo[playerid][pName]);
mysql_function_query(mysql_variable, query_string, true, "OnPlayerLogin","i", playerid);
}
else
{
SetPVarInt(playerid, "WrongPass", GetPVarInt(playerid, "WrongPass") +1);
if(GetPVarInt(playerid, "WrongPass") == 4) return ShowPlayerDialog(playerid,1001,DIALOG_STYLE_MSGBOX,"{E6B122} Лимит попыток авторизации","{FFFFFF} Вы ввели неправильный пароль 3 раза подряд.","Закрыть",""), Kick(playerid);//KickFix(playerid, COLOR_WHITE, "{FF6347}При неправильном вводе пароля Вы будете забанены");
new logtires = 4 - GetPVarInt(playerid, "WrongPass");
new string[500];
format(string,sizeof(string),"{FFFFFF}Добро пожаловать на сервер\nВаш ник зарегистрирован\n\nЛогин: {1DBF3A}%s{FFFFFF}\n{FF0000}Неверный пароль! Осталось попыток: %d", pInfo[playerid][pName], logtires);
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация",string, "Войти","Отмена");
return true;
}
return 1;
}

Mazzilla
20.03.2015, 18:38
В формате стринга явно не задействовано 500 ячеек.

Desulaid
20.03.2015, 18:43
В формате стринга явно не задействовано 500 ячеек.
Мне просто лень отсчитывать, так как текст пробный.

Desulaid
20.03.2015, 20:02
Все молчат и это значт что? Да то, что все у меня хорошо :dirol:

NewGreen
20.03.2015, 20:16
if(inputtext[0] == '\0') return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT,"Авторизация","{FFFFFF}Вы не можете продолжить авторизацию не введя пароль!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
for(new i = strlen(inputtext)-1; i != -1; i--)
{
if(inputtext[i] >= 0 && inputtext[i] <= 9 || inputtext[i] >= 'a' && inputtext[i] <= 'Z') continue;
else return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", "{FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
}

Desulaid
20.03.2015, 20:38
if(inputtext[0] == '\0') return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT,"Авторизация","{FFFFFF}Вы не можете продолжить авторизацию не введя пароль!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
for(new i = strlen(inputtext)-1; i != -1; i--)
{
if(inputtext[i] >= 0 && inputtext[i] <= 9 || inputtext[i] >= 'a' && inputtext[i] <= 'Z') continue;
else return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", "{FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
}

Ну практически хорошо написал я. Все равно впервые пишу мод :)



А это значит:

'a' && inputtext[i] <= 'Z'
типа a..z, A..Z ? Просто я даже не думал, что можно начать от маленькой до заглавной буквы алфавита. :blush2:

NewGreen
20.03.2015, 20:46
Ну практически хорошо написал я. Все равно впервые пишу мод :)



А это значит:

'a' && inputtext[i] <= 'Z'
типа a..z, A..Z ? Просто я даже не думал, что можно начать от маленькой до заглавной буквы алфавита. :blush2:
Запрещенный приём))
Я немного подзабыл позицию этих букв в таблице кодов, и то что между ними есть еще другие символы. Поэтому лучше все же использовать так:

if(inputtext[i] >= 0 && inputtext[i] <= 9 || inputtext[i] >= 'a' && inputtext[i] <= 'z ' || inputtext[i] >= 'A' && inputtext[i] <= 'Z') continue;

Desulaid
20.03.2015, 20:54
Компилятор проклинает этот код :wizard:

if(inputtext[i] >= 0 && inputtext[i] <= 9 || inputtext[i] >= 'a' && inputtext[i] <= 'z ' || inputtext[i] >= 'A' && inputtext[i] <= 'Z') continue;


new.pwn(235) : error 027: invalid character constant
new.pwn(235) : warning 215: expression has no effect
new.pwn(235) : error 001: expected token: ";", but found ")"
new.pwn(235) : error 029: invalid expression, assumed zero
new.pwn(235) : fatal error 107: too many error messages on one line

NewGreen
20.03.2015, 21:03
Компилятор проклинает этот код :wizard:

if(inputtext[i] >= 0 && inputtext[i] <= 9 || inputtext[i] >= 'a' && inputtext[i] <= 'z ' || inputtext[i] >= 'A' && inputtext[i] <= 'Z') continue;


new.pwn(235) : error 027: invalid character constant
new.pwn(235) : warning 215: expression has no effect
new.pwn(235) : error 001: expected token: ";", but found ")"
new.pwn(235) : error 029: invalid expression, assumed zero
new.pwn(235) : fatal error 107: too many error messages on one line

Вот что значит долго не писать код)) забыл расставить скобки, извиняюсь))

if((inputtext[i] >= 0 && inputtext[i] <= 9) || (inputtext[i] >= 'a' && inputtext[i] <= 'z') || (inputtext[i] >= 'A' && inputtext[i] <= 'Z')) continue;

Mazzilla
20.03.2015, 22:12
Дело не в скобках. Ошибки выдаёт на цифры 0 и 9, так как вы сравниваете один символ с буквой из алфавита и тут же с цифрой. Самый первый вариант автора самый рациональный.

alfazlo
20.03.2015, 22:44
Дело не в скобках. Ошибки выдаёт на цифры 0 и 9, так как вы сравниваете один символ с буквой из алфавита и тут же с цифрой. Самый первый вариант автора самый рациональный.
Можно использовать одну переменную static len = strlen(input); и подставлять вместо вызова тойже функи в разных частях кода)

NewGreen
20.03.2015, 23:50
Дело не в скобках. Ошибки выдаёт на цифры 0 и 9, так как вы сравниваете один символ с буквой из алфавита и тут же с цифрой. Самый первый вариант автора самый рациональный.

Есть такая таблица ASCII в которой некоторым символам сопоставлены числовые коды. Именно на основе этой таблицы выполняется проверка ниже:

if((inputtext[i] >= 0 && inputtext[i] <= 9) || (inputtext[i] >= 'a' && inputtext[i] <= 'z') || (inputtext[i] >= 'A' && inputtext[i] <= 'Z')) continue;
Вывод: компьютеру все равно, что он сравнивает число и букву сразу или по очереди, он сравнивает коды таблицы.
Теперь о скобках, ошибки возникают вероятно из-за того, что компилятор не понимает приоритета унарных операторов, и не может определить что с чем сравнивать, поставив скобки мы задаем явный приоритет, и поэтому ошибка пропадает.
Теперь о рациональности, оригинальный код был такой:


switch(inputtext[i])
{
case '0'..'9', 'a'..'z', 'A'..'Z': continue;
default: return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", "{FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
}

Если case переписать используя if он будет выглядеть примерно так:


case '0'..'9':
for(new j = 0; j < 10; j++)
if(inputtext[i] == i) return true;
'a'..'z':
for(new j = 97; j < 123; j++) // коды в таблице ASCII 97 - a, 122 - z
if(inputtext[i] == i) return true;
'A'..'Z:
for(new j = 65; j < 91; j++) // коды в таблице ASCII 65 - A, 90 - Z
if(inputtext[i] == i) return true;

Итого теоретически по 62 проверки на каждый символ массива.
В том варианте который предложил я выполняется проверка на диапазон, находится ли символ в диапазоне от до, всего 3 проверки.

Desulaid
21.03.2015, 07:53
Дело не в скобках. Ошибки выдаёт на цифры 0 и 9, так как вы сравниваете один символ с буквой из алфавита и тут же с цифрой. Самый первый вариант автора самый рациональный.

https://pp.vk.me/c608720/v608720642/bf92/VP15dwdRyZ0.jpg

- - - Добавлено - - -


Есть такая таблица ASCII в которой некоторым символам сопоставлены числовые коды. Именно на основе этой таблицы выполняется проверка ниже:

if((inputtext[i] >= 0 && inputtext[i] <= 9) || (inputtext[i] >= 'a' && inputtext[i] <= 'z') || (inputtext[i] >= 'A' && inputtext[i] <= 'Z')) continue;
Вывод: компьютеру все равно, что он сравнивает число и букву сразу или по очереди, он сравнивает коды таблицы.
Теперь о скобках, ошибки возникают вероятно из-за того, что компилятор не понимает приоритета унарных операторов, и не может определить что с чем сравнивать, поставив скобки мы задаем явный приоритет, и поэтому ошибка пропадает.
Теперь о рациональности, оригинальный код был такой:


switch(inputtext[i])
{
case '0'..'9', 'a'..'z', 'A'..'Z': continue;
default: return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", "{FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");
}

Если case переписать используя if он будет выглядеть примерно так:


case '0'..'9':
for(new j = 0; j < 10; j++)
if(inputtext[i] == i) return true;
'a'..'z':
for(new j = 97; j < 123; j++) // коды в таблице ASCII 97 - a, 122 - z
if(inputtext[i] == i) return true;
'A'..'Z:
for(new j = 65; j < 91; j++) // коды в таблице ASCII 65 - A, 90 - Z
if(inputtext[i] == i) return true;

Итого теоретически по 62 проверки на каждый символ массива.
В том варианте который предложил я выполняется проверка на диапазон, находится ли символ в диапазоне от до, всего 3 проверки.

Да ты новый DeimoS. Так же все объясняешь и расписываешь :good:

gangzone.ini
21.03.2015, 11:16
{FFFFFF}Добро пожаловать на сервер - 34
Ваш ник зарегистрирован - 23
Логин: {1DBF3A}%s{FFFFFF} - 47
{FF0000}Неверный пароль! Осталось попыток: %d - 44
new string[148];

Desulaid
21.03.2015, 14:42
new string[148];
Раз уж пошло на это дело, то 150; Так как 34+23+48+44+1=150 :dirol:
И не хочу повторяться, этот текст пробный :)

Desulaid
21.03.2015, 18:42
Решено
(закрывай тему)