shape1
shape2
shape3
shape4
shape7
shape8

Автоподсчёт размера массива


Batka1337

Хацкер-программист
Пользователь
08.12.2014
363
154
0
26
Всем привет
Сегодня я вам расскажу как оптимизировать стринги, это намного проще чем кажется
Возьмём к примеру какой нибудь неоптимизированный стринг и опробуем его оптимизировать
Код:
new string[250];
format(string,sizeof(string),"[R] %s[%d] взял %i патронов со склада. На складе: %i",playername,playerid,pt,SkladArmy);
SendFractionMessage(PlayerInfo[playerid][pMember],COLOR_LIGHTRED,string);
Думаю тут всё понятно, текст в рацию при взятии патронов
Пробуем оптимизировать
Код:
static const fmt_string[] = "[R] %s[%d] взял %i патронов со склада. На складе: %i";
new string[sizeof(fmt_string)+MAX_PLAYER_NAME+4+3+10-2-2-2-2];
format(string,sizeof(string), fmt_string,playername,playerid,pt,SkladArmy);
SendFractionMessage(PlayerInfo[playerid][pMember],COLOR_LIGHTRED,string);  
 

Вот я оптимизировал, теперь объясню какая строчка что делает
В первой строчке мы создаём переменную равную кол-ву символов в тексте(без переменных)
Во второй строчке мы создаём новую переменную, сам стринг
В ней мы складываем то что считали в первой строке и кол-во символов которые задаются в переменных и отнимаем символы для переменных то есть "%s", "%i" и т.д.
Разберём:

new string[sizeof(fmt_string)+MAX_PLAYER_NAME+4+3+10];
sizeof(fmt_string) - это кол-во символов первой строки
MAX_PLAYER_NAME - это максимальное кол-во символов в нике, то есть 32
4 - это максимальное кол-во символов в ID'e игрока
3 - это максимальное кол-во символов во взятых патронах
10 - это максимальное кол-во символов в показе сколько материалов осталось на складе

Автор способа:
Daniel Cortez
 
Последнее редактирование модератором:

JoKeR2020

Гуру
Пользователь
26.11.2014
1 800
4
321
0
@Batka1337, дельный совет, однако не использую. Вроде как помню, это методика от Daniel_Cortez'a (DC).

 

SHOROOP

Освоившийся
Пользователь
30.01.2014
58
56
0
32
Скриптер
А где оптимизация-то? Вместо одного массива на 250 ячеек в результате получилось два - один статический на 52 ячейки и второй на 85. С большим успехом можно было бы размерность массива string[] изменить сразу и не городить костыль со статиком.

 

JoKeR2020

Гуру
Пользователь
26.11.2014
1 800
4
321
0
@SHOROOP, оптимизации здесь нет, но удобней такой способ тем, что не нужно вручную задавать размер массива, я не использую его, т.к. использую Notepad++ уже давно и узнать размер строки для меня два клика.

 

Anton_Styazhkin

Новичок
Пользователь
06.01.2016
20
6
0
26
@SHOROOP, static const не будет отражен в памяти сервера. Можете проверить скомпилировать оба варианта с ключем -d3, чтобы убедиться. Плюс этого метода в том, что автоподсчет размера массива идет на этапе компляции скрипта и вам остается только манипулировать заменителями (%s и т.д.)

static const msg[] = "Привет, %s";
new fmt_msg[sizeof(msg) + (-2) + MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(fmt_msg, sizeof(fmt_msg), msg, name);
SendClientMessage(playerid, -1, fmt_msg);

Да и код кажется более компакным и симпотишны 0))

 
Последнее редактирование модератором:
A

Amfy

Гость
Гость
MAX_PLAYER_NAME - это максимальное кол-во символов в нике, то есть 32
Когда это MAX_PLAYER_NAME стал 32?

Строка из a_samp:

#define MAX_PLAYER_NAME (24)

10 - это максимальное кол-во символов в показе сколько материалов осталось на складе
А это что? new string[sizeof(fmt_string)+MAX_PLAYER_NAME+4+3+10-2-2-2-2];

 

Anton_Styazhkin

Новичок
Пользователь
06.01.2016
20
6
0
26

 

#if defined MAX_PLAYER_NAME
#undef MAX_PLAYER_NAME
#endif
#define MAX_PLAYER_NAME 32

А если серьезно, то это совершенно никак не меняет сути. Ведь мы используем макрос, другое дело, если бы цифры писал, то тогда да, помидорчики все в автора полетят.

PS. название темы не отражает ее сути. Предлагаю переименовать в "автоподсчет размера массива".

 

Anton_Styazhkin

Новичок
Пользователь
06.01.2016
20
6
0
26
@SHOROOP, да, но стека мы тут не касаемся. Этот массив учитывается в секции данных, что равно, если 

SendClientMessage(playerid, -1, "Текст");

Вот "Текст" пойдет в секцию данных. 

 

SHOROOP

Освоившийся
Пользователь
30.01.2014
58
56
0
32
Скриптер
да, но стека мы тут не касаемся
Пардон, действительно, запамятовал, что в данном случае в секцию data уйдет.
Тем не менее, такую оптимизацию считаю несущественной: string[] все равно уйдет в стек, при равной размерности в предложенном варианте получается сугубо лишний огород в плане организации кода. Если кому-то так использовать удобнее - флаг в руки, но явной оптимизации я тут не вижу - с тем же успехом вручную можно размерность string[] указывать корректно.

 

Anton_Styazhkin

Новичок
Пользователь
06.01.2016
20
6
0
26
@SHOROOP,это и не оптимизация. Это автопосчет размера массива. Оба результата будут одинаковыми.