PDA

Просмотр полной версии : [Вопрос] Облегчение кода



#Johnson
06.04.2018, 16:08
Добрый день. Подскажите пожалуйста как можно тут облегчить код, избавиться от не нужного.
Желательно с пояснением.
Заранее огромное спасибо!

stock CheckRegistration(playerid)
{
new password[31],email[50],refer[24];

format(password, sizeof(password), "%s", PlayerRegInfo[playerid][Password]);
format(email, sizeof(email), "%s", PlayerRegInfo[playerid][Email]);
format(refer, sizeof(refer), "%s", PlayerRegInfo[playerid][Ref]);

new skin = PlayerRegInfo[playerid][Skin];
new race = PlayerRegInfo[playerid][Rassa];
new gender = PlayerRegInfo[playerid][Gender];

new check_race[25],check_gender[20];
switch(gender)
{
case 1: format(check_gender, sizeof(check_gender), "{4582A1}Мужской");
case 2: format(check_gender, sizeof(check_gender), "{4582A1}Женский");
default: format(check_gender, sizeof(check_gender), "{AA3333}Не выбран");
}
switch(race)
{
case 1: format(check_race, sizeof(check_race), "{4582A1}Афроамереканец");
case 2: format(check_race, sizeof(check_race), "{4582A1}Европеец");
case 3: format(check_race, sizeof(check_race), "{4582A1}Азиат");
default: format(check_race, sizeof(check_race), "{AA3333}Не выбрана");
}


static const password_line[] = "{FFFFFF}Пароль: %s%s\n{FFFFFF}";
static const email_line[] = "%sПочта: %s%s\n{FFFFFF}";
static const refferal_line[] = "%sРеферал: %s%s\n{FFFFFF}";
static const sex_line[] = "%sПол: %s%s\n{FFFFFF}";
static const national_line[] = "%sНациональность: %s%s\n{FFFFFF}";
static const appearance_line[] = "%sВнешность: %s\n{FFFFFF}";
static const nextreg_line[] = "%s{4582A1}Продолжить регистрацию\n";
static const next1reg_line[] = "%s{AA3333}Продолжить регистрацию\n";

new reg_str[-7 + sizeof(password_line) + (-2+MAX_PLAYER_NAME) + (-2+31) +
sizeof(email_line) + (-2+50) +
sizeof(refferal_line) - 2 + (MAX_PLAYER_NAME*2) +
sizeof(sex_line) + (-2+20) +
sizeof(national_line) + (-2+25)+
sizeof(appearance_line) + (-2 +15) +
sizeof(nextreg_line) + sizeof(next1reg_line) -4 +
(8*6)];

format::reg_str(password_line, (strlen(password) > 1) ? ("{4582A1}") : ("{AA3333}"),(strlen(password) > 1) ? (password) : ("Не задан"));
format::reg_str(email_line, (strlen(email) > 1) ? ("{4582A1}") : ("{AA3333}"),(strlen(email) > 1) ? (email) : ("Не задан"));
format::reg_str(refferal_line, (strlen(refer) > 1) ? ("{4582A1}") : ("{AA3333}"),(strlen(refer) > 1) ? (refer) : ("Не задан"));
format::reg_str(sex_line, (strlen(check_gender) > 1) ? ("{4582A1}") : ("{AA3333}"),(strlen(check_gender) > 1) ? (check_gender) : ("Не Выбран"));
format::reg_str(national_line, (check_race) ? ("{4582A1}") : ("{AA3333}"),(strlen(check_race) > 1) ? (check_race) : ("Не Выбрана"));
format::reg_str(appearance_line, (skin) ? ("{4582A1}Выбрана") : ("{AA3333}"));

if(strlen(password) > 1 && strlen(email) > 1 && gender && race && skin) format(reg_str, sizeof(reg_str), nextreg_line);
else format(reg_str, sizeof(reg_str), next1reg_line);

ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_LIST, "{FFFFFF}Регистрация на {AA3333}"NAME_SERVER"",reg_str, "Далее", "Отмена");
return true;
}

Long-
06.04.2018, 21:44
Ну, можно выиграть процессорное время, все формат заменить на strcat.
И зачем такой подсчет в переменной? Нельзя выбрать самый большой массив с самым большим кол-во символов и его использовать для всех?
В целом тут можно ничего и не упрощать, если это и так хорошо работает.
И еще можно увеличить читабельность, вынести текст который в "switch" в массив, и по нему работать.

pawnoholic
06.04.2018, 23:37
Упрл?

new reg_str[-7 + sizeof(password_line) + (-2+MAX_PLAYER_NAME) + (-2+31) +
sizeof(email_line) + (-2+50) +
sizeof(refferal_line) - 2 + (MAX_PLAYER_NAME*2) +
sizeof(sex_line) + (-2+20) +
sizeof(national_line) + (-2+25)+
sizeof(appearance_line) + (-2 +15) +
sizeof(nextreg_line) + sizeof(next1reg_line) -4 +
(8*6)];

Geebrox
07.04.2018, 00:27
Код (Pastebin) (https://pastebin.com/GZP0nq0f)

На работоспособность не проверял, писал на быструю руку. Но думаю лучше, чем код выше.

#Johnson
07.04.2018, 15:50
Код (Pastebin) (https://pastebin.com/GZP0nq0f)

На работоспособность не проверял, писал на быструю руку. Но думаю лучше, чем код выше.


c:\Users\Nuttz\Desktop\NewProject\pawno\include\sscanf2.inc(270) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\pawno\include\sscanf2.inc(270) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\pawno\include\sscanf2.inc(330) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\pawno\include\sscanf2.inc(330) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(248) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(501) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(757) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(775) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(802) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(820) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(911) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1000) : предупреждение 219: переменная "string" уже объявлена в более глобальной зоне видимости
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1311) : ошибка 008: должно быть постоянным выражением; принят ноль
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1326) : ошибка 017: необъявленный символ "COLOR_BLUE"
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1326) : неправильная табуляция
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1326) : предупреждение 215: выражение не имеет эффекта
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1326) -- (1327) : ошибка 017: необъявленный символ "COLOR_BLUE"
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1327) -- (1328) : предупреждение 215: выражение не имеет эффекта
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1328) : ошибка 001: ожидался токен ";", но найден "}"
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1328) : фатальная ошибка 107: слишком много ошибок на одной строке
Компиляция остановлена.
Pawn compiler 3.2.3664 Copyright (c) 1997-2017, ITB CompuPhase
Ошибок:5.

P.S. Все проверки поставил перед энуминатором (в начале мода, где у меня все #define)
1.Тут ошибки как скобка не закрыта

static const gender_info[][] =
{
COLOR_RED "Не выбран",
COLOR_BLUE "Мужской",
COLOR_BLUE "Женский"
};

static const race_info[][] =
{
COLOR_RED "Не выбрана",
COLOR_BLUE "Афроамереканец",
COLOR_BLUE "Европеец",
COLOR_BLUE "Азиат"
};
2.
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1311) : ошибка 008: должно быть постоянным выражением; принят ноль

password[MAX_PLAYER_PASSWORD] = PlayerRegInfo[playerid][Password],
3.
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1344) : ошибка 001: ожидался токен "-string end-", но найден "-identifier-"
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1344) : неправильная табуляция
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1344) : предупреждение 215: выражение не имеет эффекта
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1344) : ошибка 001: ожидался токен ";", но найден "-integer value-"
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1344) : ошибка 001: ожидался токен "-string end-", но найден "-identifier-"
c:\Users\Nuttz\Desktop\NewProject\gamemodes\new.pwn(1344) : фатальная ошибка 107: слишком много ошибок на одной строке

static const string_content[] =
COLOR_WHITE "Пароль: %s%s\n\
"COLOR_WHITE "Почта: %s%s\n\
"COLOR_WHITE "Реферал: %s%s\n\
"COLOR_WHITE "Пол: %s\n\
"COLOR_WHITE "Национальность: %s\n\
%sПродолжить регистрацию\n";

Geebrox
08.04.2018, 23:29
Прошу прощения, был вечер, был сонным + написал же: "На работоспособность не проверял".
Обновил код: Pastebin (https://pastebin.com/tjDr3zqP)

#Johnson
09.04.2018, 00:21
Всем спасибо, проблема решена, модераторы, закройте пожалуйста тему.