PDA

Просмотр полной версии : [Вопрос] Что будет эффективней?



Rasta
26.08.2014, 18:24
Пишу мод с 0, добрался до команд.
Использую процессор DC_MD.
Я как-то не прислушивался к теме "Обработка информации мода и его компиляция".
Хотел разузнать у вас что, да как. Слышал от некоторых людей, что большой код влияет на скорость обработки информации, а также, на скорость компиляции мода.

Ниже предоставлю пару примеров, оба рабочие.
1й способ более оптимизирован, но занимает больше места, 2й же - меньше места.
Учитывая, что если весь код мода будет написан с помощью подобных способов (1 способ), то будет ли он влиять на скорость обработки и компиляции мода?
Прошу не оффтопить в теме. Еще раз повторяюсь, что я этот момент как-то пропустил мимо своих ушей, теперь задаюсь вопросами.


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]");
if(0 == IsPlayerConnected(getid)) return Message(playerid, COLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
static const
fmt_str1[] = "Администратор %s(%d) Вас заморозил.",
fmt_str2[] = "Вы заморозили игрока %s(%d).";
const
fmt1_size = sizeof(fmt_str1) - 2 + MAX_PLAYER_NAME - 2 + 3,
fmt2_size = sizeof(fmt_str2) - 2 + MAX_PLAYER_NAME - 2 + 3;
#if fmt1_size > fmt2_size
const size = fmt1_size;
#else
const size = fmt2_size;
#endif
new msg[size];
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);
}

new strcmd[144];
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);
}

Flime
26.08.2014, 18:41
Я предпочитаю использовать 1 способ. Кажется, он лучше :)

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

Главное - это не размер кода, а степень оптимизации.

^_^
26.08.2014, 19:31
Итак, подсчитаем:
1 вариант:
Часто начал замечать такую дебильную тенденцию (в частности Про-Павн) максимально утруждать свой код и сваливать всю свою лень на препроцессор.

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 вариант:

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 идеальный вариант:

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);
}


Я предпочитаю использовать 1 способ. Кажется, он лучше :)

Если код воспринимается труднее или соответствует какой-нибудь новой тенденции это не означает что он является лучше.

DeimoS
26.08.2014, 20:12
Вы, кажется, кое-чего не поняли... Усложняет код не его размер, а число вычислений, которые нужно сделать серверу при обработке кода.
А оптимизация бывает разная. Например, в первом варианте вы "оптимизировали" код тем, что сняли с себя обязанность подсчитывать размер строки. При этом вы заставили это делать препроцессор, что увеличит время компиляции (незначительно, но всё же). И чтоб знать то, какой из параметров вы урезаете взамен оптимизации другого/их параметров - нужно знать теорию. Например то, что такое препроцессор и что он делает.

Rasta
26.08.2014, 20:19
DeimoS, если я Вас правильно понял, то сам оптимальным вариантом будет считаться 2-й приведенный вариант ^_^?


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);
}

DeimoS
26.08.2014, 20:22
DeimoS, если я Вас правильно понял, то сам оптимальным вариантом будет считаться 2-й приведенный вариант ^_^?


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);
}

Нет. Третий. Там, где используется локальная переменная, использующая память стэка, а не глобальную.

Osetin
26.08.2014, 20:26
DeimoS, если я Вас правильно понял, то сам оптимальным вариантом будет считаться 2-й приведенный вариант ^_^?


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);
}

Вам уже скинули код:


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);
}

Rasta
26.08.2014, 20:30
Osetin, просто хотел убедится.
Ну что же, всем спасибо за советы. Буду придерживаться такой структуры написания.
Хотя, у меня совсем были другие предположения...

Salvacore
26.08.2014, 21:42
Вы меня все обижаете (((

Rasta
26.08.2014, 21:45
Вы меня все обижаете (((

Не понял...

Salvacore
26.08.2014, 21:47
Не понял...
Чисто профессиональный юмор для близко знакомых с моим кодом.

Daniel_Cortez
26.08.2014, 22:17
Итак, подсчитаем:
1 вариант:
Часто начал замечать такую дебильную тенденцию (в частности Про-Павн) максимально утруждать свой код и сваливать всю свою лень на препроцессор.

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

Чёрд, да если верить таким отзывам, из-за меня на Pro-Pawn одни проблемы.

Что ж, расставлю все точки над "i".
Ещё в прошлом году я придумал такой трюк с подсчётом размера строки, чтобы, как многие из вас уже догадались, уменьшить используемый серверов объём стекового пространства.


SimplePawn
Я думал, этой программой уже никто не пользуется.

Да, у топикстартера в 1-м варианте код выглядит раздутым, и учитывая скудные возможности препроцессора в компиляторе Pawn, вряд ли с этим можно что-то сделать.
Но в то же время такой код куда более универсален. Если нужно изменить содержимое форматной строки, придётся... всего лишь изменить это содержимое - остальную работу компилятор сделает сам, не нужно ничего пересчитывать.
IMO, именно таким и должен быть качественный код.

Если же полагаться на сторонние программы вроде SimplePawn, каждый раз придётся выискивать её, чтобы пересчитать всё заново.
По сути всё сводится к "хочешь поменять текст? живо ищи калькулятор! или SimplePawn!" -_-
Пожалуй, это и оказалось основной причиной прекращения дальнейшей разработки той программы.

Rasta
26.08.2014, 23:03
Daniel_Cortez, Да ема е. Я уже почти все команды переписал...

Да, у топикстартера в 1-м варианте код выглядит раздутым
Мне это не очень важно, учитывая, если код качественный и обрабатывается быстрее.
Теперь я вообще не понимаю, что всё таки лучше? Мнения расходятся...

Rasta
27.08.2014, 01:17
Никто не ответит? Просто остановился на половине, а дальше не знаю как именно писать. Буду благодарен.

Salvacore
27.08.2014, 02:40
:D
Тут твой выбор, есть 2 мнения, выбирай что ближе.(1)

underwoker
27.08.2014, 03:29
Я в свое время предпочел такой вариант. Как предложил ^_^:

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);
}
Просто, понятно и работает как часики. А гнаться за милисекундами, как уже говорилось много раз не стоит.

Salvacore
27.08.2014, 03:48
Я в свое время предпочел такой вариант. Как предложил ^_^:

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);
}
Просто, понятно и работает как часики. А гнаться за милисекундами, как уже говорилось много раз не стоит.

Раз не погнался, два не погнался, и тут вдруг твой мод оказывается RLS'ом.

Rasta
27.08.2014, 04:03
Раз не погнался, два не погнался, и тут вдруг твой мод оказывается RLS'ом.
Подобного слогана придерживался.

Я бы предпочёл 1-й способ, так как от начала с ним работаю.
Суть не в этом.
Если 1-й способ будет считаться медленнее 2-ого, но качественным и универсальным, то считается ли он эффективным?
Или же всё в порядке, оба одинаковы и выбирать уже на свой вкус?
Я так точного ответа и не услышал. Можете просто мне ответить, что считается лучшим вариантом?

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

Так как, после 3-ого поста, я переписал практически половину своего кода.
Не очень-то увлекает меня переписывать код по-несколько раз. Просто, хочу точно закрепить у себя в голове что лучше и, в дальнейшем, придерживаться этих способов, естественно, до появления новых "продвинутых" :)

Rasta
27.08.2014, 04:46
Вопрос не решён.

Salvacore
27.08.2014, 05:05
А ты затести, какой вариант команды быстрее.

DeimoS
27.08.2014, 08:24
Но в то же время такой код куда более универсален. Если нужно изменить содержимое форматной строки, придётся... всего лишь изменить это содержимое - остальную работу компилятор сделает сам, не нужно ничего пересчитывать.
IMO, именно таким и должен быть качественный код.

Вот тут ты не прав :) Если я захочу добавить пару параметров для вывода в сообщение, мне всё равно придётся работать с массивом. А если делать каждую короткую строку таким способом, код будет раза в 3 больше и менее удобен. Имхо: такой вариант хорош для очень длинных строк, которые периодически редактируются (правила сервера, инфа о сервере и т.п.). Делать же подсчёт таким способом для коротких строк как-то тупо, ибо ты больше времени на написание всех констант и массивов убьёшь, нежели если бы ты даже без калькулятора всё подсчитывал.


Если же полагаться на сторонние программы вроде SimplePawn, каждый раз придётся выискивать её, чтобы пересчитать всё заново.
По сути всё сводится к "хочешь поменять текст? живо ищи калькулятор! или SimplePawn!" -_-
Пожалуй, это и оказалось основной причиной прекращения дальнейшей разработки той программы.

Ну не знаю. Я пользуюсь твоей StringLength, которую ты в SimplePawn засунул и не жалуюсь. Поместил её в панель задач и чтоб вызвать её в нужный момент, достаточно скопировать нужную строку, опустить мышку вниз экрана (панель задач автоматически скрывается) и выбрать программу. Далее "CTRL + V" и передо мной уже имеется размер строки. Не думаю, что это сложнее танцев с константами и массивами

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


Раз не погнался, два не погнался, и тут вдруг твой мод оказывается RLS'ом.

Чушь сказал. Как от того, что строки не подсчитывает препроцессор, команды станут работать медленнее? -_- Раньше все жили без этого метода и никто не страдал. Не надо вводить людей в заблуждение. Командами вообще очень трудно заставить мод лагать


Подобного слогана придерживался.

Я бы предпочёл 1-й способ, так как от начала с ним работаю.
Суть не в этом.
Если 1-й способ будет считаться медленнее 2-ого, но качественным и универсальным, то считается ли он эффективным?
Или же всё в порядке, оба одинаковы и выбирать уже на свой вкус?
Я так точного ответа и не услышал. Можете просто мне ответить, что считается лучшим вариантом?

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

Так как, после 3-ого поста, я переписал практически половину своего кода.
Не очень-то увлекает меня переписывать код по-несколько раз. Просто, хочу точно закрепить у себя в голове что лучше и, в дальнейшем, придерживаться этих способов, естественно, до появления новых "продвинутых" :)

Вы не в том случае гонитесь за быстродействием. Команды не вызываются таймером и их вызов всегда рандомен => вся ваша скорость "расплывается" среди других функций. Придерживайтесь того способа, который удобнее лично вам и пишите на нём. Ибо именно вам работать с вашим кодом через год. И если сейчас вам всё привычно и понятно, то потом вы забудете половину всего того, что писали и код будет уже восприниматься иначе.
А раздутость не делает код лучше, если вы собираетесь продолжить поддержку кода в дальнейшем. Ибо чем больше ненужных строк в вашем коде, тем сложнее среди них найти нужный код. Чуть позже вы это поймёте :)

OKStyle
27.08.2014, 09:16
Я в свое время предпочел такой вариант. Как предложил ^_^:

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);
}
Просто, понятно и работает как часики. А гнаться за милисекундами, как уже говорилось много раз не стоит.
:good2: наиболее адекватный вариант.

Salvacore
27.08.2014, 09:23
Я весь мод переписал на эту фичу, отлично всё работает. И проблем нет.

Клоню к тому, что дело каждого.

Daniel_Cortez
27.08.2014, 13:25
Вот тут ты не прав :) Если я захочу добавить пару параметров для вывода в сообщение, мне всё равно придётся работать с массивом.
Вовсе нет. Нужно будет лишь заменить содержимое константы и добавить пару чисел в формулу расчёта длины строки. Всяко лучше, чем вручную рассчитывать всё на калькуляторе.


А если делать каждую короткую строку таким способом, код будет раза в 3 больше и менее удобен.
Если научиться работать по тому методу, можно привыкнуть не обращать внимания на "лишние" строки с расчётами.


Имхо: такой вариант хорош для очень длинных строк, которые периодически редактируются (правила сервера, инфа о сервере и т.п.). Делать же подсчёт таким способом для коротких строк как-то тупо, ибо ты больше времени на написание всех констант и массивов убьёшь, нежели если бы ты даже без калькулятора всё подсчитывал.
Возможно. Впрочем, работать сразу с несколькими стандартами может оказаться затруднительно.



Ну не знаю. Я пользуюсь твоей StringLength, которую ты в SimplePawn засунул и не жалуюсь. Поместил её в панель задач и чтоб вызвать её в нужный момент, достаточно скопировать нужную строку, опустить мышку вниз экрана (панель задач автоматически скрывается) и выбрать программу. Далее "CTRL + V" и передо мной уже имеется размер строки. Не думаю, что это сложнее танцев с константами и массивами
Кому как. Лично мне проще было написать "sizeof(string)", чем тянуться за мышью, искать программу для подсчёта и открывать нужный инструмент.


Клоню к тому, что дело каждого.
Agreed.


Попробуем подвести итоги.
Нужен качественный код, готовый к оперативному внесению изменений? Используйте 1-й способ.
Не хотите нагромождать код лишними расчётами? Не умеете быстро печатать? Доставайте калькулятор.

Salvacore
27.08.2014, 13:42
Ну, это, чисто чтобы ужаснулись.

CMD:showlicenses(playerid, params[])
{
static const
cmd_shl_fmt_str0[] = "[ -------------- Ëèöåíçèè %s -------------- ]",
cmd_shl_fmt_str1[] = "Âîäèòåëüñêèå ïðàâà: %s",
cmd_shl_fmt_str2[] = "Ëèöåíçèÿ íà ïîëåòû: %s",
cmd_shl_fmt_str3[] = "Ëèöåíçèÿ íà îðóæèå: %s",
cmd_shl_fmt_str4[] = "Ëèöåíçèÿ íà ñóäîõîäñòâî: %s",
cmd_shl_fmt_str5[] = "Ëèöåíçèÿ íà ðûáîëîâñòâî: %s",
cmd_shl_fmt_str6[] = "Âû ïîêàçàëè ñâîè ëèöåíçèè %s",
cmd_shl_fmt_str7[] = "%s ïîêàçàë âàì ñâîè ëèöåíçèè",
cmd_shl_fmt_str8[] = "%s ïîêàçàë ñâîè ëèöåíçèè %s'ó"
;
const
cmd_shl_fmt_size0 = sizeof(cmd_shl_fmt_str0)-2+MAX_PLAYER_NAME,
cmd_shl_fmt_size1 = sizeof(cmd_shl_fmt_str1)-2+3,
cmd_shl_fmt_size2 = sizeof(cmd_shl_fmt_str2)-2+3,
cmd_shl_fmt_size3 = sizeof(cmd_shl_fmt_str3)-2+3,
cmd_shl_fmt_size4 = sizeof(cmd_shl_fmt_str4)-2+3,
cmd_shl_fmt_size5 = sizeof(cmd_shl_fmt_str5)-2+3,
cmd_shl_fmt_size6 = sizeof(cmd_shl_fmt_str5)-2+MAX_PLAYER_NAME,
cmd_shl_fmt_size7 = sizeof(cmd_shl_fmt_str5)-2+MAX_PLAYER_NAME,
cmd_shl_fmt_size8 = sizeof(cmd_shl_fmt_str5)-2+MAX_PLAYER_NAME-2+MAX_PLAYER_NAME
;
#if cmd_shl_fmt_size0>cmd_shl_fmt_size1
#define cmd_shl_fmt_size cmd_shl_fmt_size0
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size1
#endif
#undef cmd_shl_fmt_size
#if cmd_shl_fmt_size2>cmd_shl_fmt_size3
#define cmd_shl_fmt_size cmd_shl_fmt_size2
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size3
#endif
#undef cmd_shl_fmt_size
#if cmd_shl_fmt_size4>cmd_shl_fmt_size5
#define cmd_shl_fmt_size cmd_shl_fmt_size4
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size5
#endif
#undef cmd_shl_fmt_size
#if cmd_shl_fmt_size6>cmd_shl_fmt_size7
#define cmd_shl_fmt_size cmd_shl_fmt_size7
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size8
#endif
#if cmd_shl_fmt_size8>cmd_shl_fmt_size
#define cmd_shl_fmt_size cmd_shl_fmt_size8
#endif
new cmdshwl[cmd_shl_fmt_size];
if(sscanf(params, "u", params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "Ââåäèòå: /showlicenses [id èãðîêà]");
if(!IsPlayerConnected(params[0]))
return SendClientMessage(playerid, COLOR_GREY, PlayerIsNotOnline);
if(!PlayerLogged{params[0]})
return SendClientMessage(playerid, COLOR_GREY, PlayerIsNotLogged);
if(playerid == params[0])
return SendClientMessage(playerid, COLOR_GREY, "Èñïîëüçóéòå: /licenses");
if(!IsPlayerInRangeOfPlayer(8.0, playerid, params[0]))
return SendClientMessage(playerid, COLOR_GREY, "Èãðîê ñëèøêîì äàëåêî!");
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str0, PlayerInfo[playerid][pSendername]);
SendClientMessage(params[0], COLOR_LIGHTRED, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str1, (!PlayerInfo[playerid][pLic][0]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str2,(!PlayerInfo[playerid][pLic][2]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str3,(!PlayerInfo[playerid][pLic][4]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str4,(!PlayerInfo[playerid][pLic][1]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str5,(!PlayerInfo[playerid][pLic][3]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
SendClientMessage(playerid, COLOR_LIGHTRED, "[ ------------------------------------- ]");
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str6, PlayerInfo[params[0]][pSendername]);
SendClientMessage(playerid, COLOR_LIGHTBLUE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str7, PlayerInfo[playerid][pSendername]);
SendClientMessage(params[0], COLOR_LIGHTBLUE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str8,PlayerInfo[playerid][pSendername], PlayerInfo[params[0]][pSendername]);
ProxDetectorNew(playerid, 30.0, COLOR_PURPLE, cmdshwl);
return 1;
}

Rasta
27.08.2014, 15:29
Всем огромное спасибо за советы. Всё продумал и учёл для себя.
Спасибо. Тему можно закрывать.

underwoker
27.08.2014, 16:26
Ну, это, чисто чтобы ужаснулись.

CMD:showlicenses(playerid, params[])
{
static const
cmd_shl_fmt_str0[] = "[ -------------- Ëèöåíçèè %s -------------- ]",
cmd_shl_fmt_str1[] = "Âîäèòåëüñêèå ïðàâà: %s",
cmd_shl_fmt_str2[] = "Ëèöåíçèÿ íà ïîëåòû: %s",
cmd_shl_fmt_str3[] = "Ëèöåíçèÿ íà îðóæèå: %s",
cmd_shl_fmt_str4[] = "Ëèöåíçèÿ íà ñóäîõîäñòâî: %s",
cmd_shl_fmt_str5[] = "Ëèöåíçèÿ íà ðûáîëîâñòâî: %s",
cmd_shl_fmt_str6[] = "Âû ïîêàçàëè ñâîè ëèöåíçèè %s",
cmd_shl_fmt_str7[] = "%s ïîêàçàë âàì ñâîè ëèöåíçèè",
cmd_shl_fmt_str8[] = "%s ïîêàçàë ñâîè ëèöåíçèè %s'ó"
;
const
cmd_shl_fmt_size0 = sizeof(cmd_shl_fmt_str0)-2+MAX_PLAYER_NAME,
cmd_shl_fmt_size1 = sizeof(cmd_shl_fmt_str1)-2+3,
cmd_shl_fmt_size2 = sizeof(cmd_shl_fmt_str2)-2+3,
cmd_shl_fmt_size3 = sizeof(cmd_shl_fmt_str3)-2+3,
cmd_shl_fmt_size4 = sizeof(cmd_shl_fmt_str4)-2+3,
cmd_shl_fmt_size5 = sizeof(cmd_shl_fmt_str5)-2+3,
cmd_shl_fmt_size6 = sizeof(cmd_shl_fmt_str5)-2+MAX_PLAYER_NAME,
cmd_shl_fmt_size7 = sizeof(cmd_shl_fmt_str5)-2+MAX_PLAYER_NAME,
cmd_shl_fmt_size8 = sizeof(cmd_shl_fmt_str5)-2+MAX_PLAYER_NAME-2+MAX_PLAYER_NAME
;
#if cmd_shl_fmt_size0>cmd_shl_fmt_size1
#define cmd_shl_fmt_size cmd_shl_fmt_size0
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size1
#endif
#undef cmd_shl_fmt_size
#if cmd_shl_fmt_size2>cmd_shl_fmt_size3
#define cmd_shl_fmt_size cmd_shl_fmt_size2
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size3
#endif
#undef cmd_shl_fmt_size
#if cmd_shl_fmt_size4>cmd_shl_fmt_size5
#define cmd_shl_fmt_size cmd_shl_fmt_size4
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size5
#endif
#undef cmd_shl_fmt_size
#if cmd_shl_fmt_size6>cmd_shl_fmt_size7
#define cmd_shl_fmt_size cmd_shl_fmt_size7
#else
#define cmd_shl_fmt_size cmd_shl_fmt_size8
#endif
#if cmd_shl_fmt_size8>cmd_shl_fmt_size
#define cmd_shl_fmt_size cmd_shl_fmt_size8
#endif
new cmdshwl[cmd_shl_fmt_size];
if(sscanf(params, "u", params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "Ââåäèòå: /showlicenses [id èãðîêà]");
if(!IsPlayerConnected(params[0]))
return SendClientMessage(playerid, COLOR_GREY, PlayerIsNotOnline);
if(!PlayerLogged{params[0]})
return SendClientMessage(playerid, COLOR_GREY, PlayerIsNotLogged);
if(playerid == params[0])
return SendClientMessage(playerid, COLOR_GREY, "Èñïîëüçóéòå: /licenses");
if(!IsPlayerInRangeOfPlayer(8.0, playerid, params[0]))
return SendClientMessage(playerid, COLOR_GREY, "Èãðîê ñëèøêîì äàëåêî!");
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str0, PlayerInfo[playerid][pSendername]);
SendClientMessage(params[0], COLOR_LIGHTRED, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str1, (!PlayerInfo[playerid][pLic][0]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str2,(!PlayerInfo[playerid][pLic][2]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str3,(!PlayerInfo[playerid][pLic][4]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str4,(!PlayerInfo[playerid][pLic][1]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str5,(!PlayerInfo[playerid][pLic][3]) ? ("{FF6347}Íåò"):("{33CCFF}Åñòü"));
SendClientMessage(params[0], COLOR_WHITE, cmdshwl);
SendClientMessage(playerid, COLOR_LIGHTRED, "[ ------------------------------------- ]");
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str6, PlayerInfo[params[0]][pSendername]);
SendClientMessage(playerid, COLOR_LIGHTBLUE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str7, PlayerInfo[playerid][pSendername]);
SendClientMessage(params[0], COLOR_LIGHTBLUE, cmdshwl);
format(cmdshwl,sizeof(cmdshwl),cmd_shl_fmt_str8,PlayerInfo[playerid][pSendername], PlayerInfo[params[0]][pSendername]);
ProxDetectorNew(playerid, 30.0, COLOR_PURPLE, cmdshwl);
return 1;
}
А потом человек прочитавший твой код умрет в конвульсиях. Клоз тему, правда.

OKStyle
27.08.2014, 16:51
Только почему -2, да и sizeof можно поменять на strlen - разница в 1 знак.

DeimoS
27.08.2014, 18:56
Вовсе нет. Нужно будет лишь заменить содержимое константы и добавить пару чисел в формулу расчёта длины строки. Всяко лучше, чем вручную рассчитывать всё на калькуляторе.

О каком калькуляторе идёт речь? StringLength выдаёт нам длину строки. К этой длине строки тут же, прямо при объявлении массива, прибавляем длину остальных параметров и всё, готово. Какие калькуляторы?


Кому как. Лично мне проще было написать "sizeof(string)", чем тянуться за мышью, искать программу для подсчёта и открывать нужный инструмент.

Только sizeof? А в константу кто будет строку помещать? Да ещё и не в одну, если строка длинная. И всё равно нужно подсчитывать число заполнителей, дабы вычесть их длину из sizeof. В то время как StringLength я уже давно пропишу длину строки в виде числа и приплюсую длину всех остальных данных, что будут вставляться вместо заполнителя.

На всё остальное можно найти ответ в моём предыдущем сообщении

Gressie
28.08.2014, 03:35
А можно увидеть мануал или урок про то что вы пишите, где первый вариант?