Итак, подсчитаем:
1 вариант:
Часто начал замечать такую дебильную тенденцию (в частности Про-Павн) максимально утруждать свой код и сваливать всю свою лень на препроцессор.
PHP код:
CMD:freeze(playerid, params[])
{
if(PInfo[playerid][pAdmin] < 1) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
extract params -> new player:getid; else return Message(playerid, COLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");//-4 байта из стека
if(0 == IsPlayerConnected(getid)) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
static const
fmt_str1[] = "Администратор %s(%d) Вас заморозил.", // + 36*4=144 байта
fmt_str2[] = "Вы заморозили игрока %s(%d)."; // + 28*4=112 байта
const
fmt1_size = sizeof(fmt_str1) - 2 + MAX_PLAYER_NAME - 2 + 3, // 36 - 2 + 24 - 2 + 3 = 59;
fmt2_size = sizeof(fmt_str2) - 2 + MAX_PLAYER_NAME - 2 + 3; // 28 - 2 + 24 - 2 + 3 = 51;
#if fmt1_size > fmt2_size
const size = fmt1_size;
#else
const size = fmt2_size;
#endif
new msg[size];// + 59 * 4 = 236;
format(msg, sizeof(msg), fmt_str1, Nick(playerid)), Message(getid, COLOR_RED, msg);
format(msg, sizeof(msg), fmt_str2, Nick(getid)), Message(playerid, COLOR_RED, msg);
return TogglePlayerControllable(getid, false);
} //Итого 144 + 112 + 144 = 462
Итог: размер сегмента данных увеличится на 462 байтов, препроцессор выполнит ненужную проверку и ненужные расчёты, для некоторых код станет непонятным, увеличивается размер .pwn файла.
2 вариант:
PHP код:
new strcmd[144]; // + 144 * 4 = 576 байтов
CMD:freeze(playerid, params[])
{
if(PInfo[playerid][pAdmin] < 1) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
else if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");
else if(!IsPlayerConnected(params[0])) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
format(strcmd, sizeof(strcmd), "Администратор %s(%d) Вас заморозил.", Nick(playerid));
Message(params[0], COLOR_RED, strcmd);
format(strcmd, sizeof(strcmd), "Вы заморозили игрока %s(%d).", Nick(params[0]));
Message(playerid, COLOR_RED, strcmd);
return TogglePlayerControllable(params[0], false);
}
Итог: размер сегмента данных увеличится на 576 байтов.
ОБЩИЙ ВЫВОД: Оба варианта плохи. Первый тем что он сам по себе вмещает ненужные препроцессорные проверки и расчёты (их легко может подсчитать сам скриптер - обычным калькулятором и такой удобной программкой как SimplePawn, которая подсчитывает размер форматируемеой строки), а второй тем что указан слишком большой размер массива, тем без всякого смысла теряется лишняя память из сегмента данных.
IMO идеальный вариант:
PHP код:
CMD:freeze(playerid, params[])
{
new strcmd[59];//Вместо потерянной памяти из сегмента данных используем стек, при этом теряем 0 байтов
if(PInfo[playerid][pAdmin] < 1) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
else if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");
else if(!IsPlayerConnected(params[0])) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
format(strcmd, sizeof(strcmd), "Администратор %s(%d) Вас заморозил.", Nick(playerid));
Message(params[0], COLOR_RED, strcmd);
format(strcmd, sizeof(strcmd), "Вы заморозили игрока %s(%d).", Nick(params[0]));
Message(playerid, COLOR_RED, strcmd);
return TogglePlayerControllable(params[0], false);
}
![Цитата](images/styles/AnimatedArena/misc/quote_icon.png)
Сообщение от
Flime
Я предпочитаю использовать 1 способ. Кажется, он лучше :)
Если код воспринимается труднее или соответствует какой-нибудь новой тенденции это не означает что он является лучше.