PDA

Просмотр полной версии : [Вопрос] Помогите с оптимизацией "развозчиков", а именно большой стринг.



StevenH
20.12.2015, 23:54
Всем привет. Делаю развозчиков, многим я уже надоел с этими вопросами, но сейчас куда более серьёзней у меня вопрос/проблемка.
Дело в том, что string очень большой. Можно как то ли оптимизировать, что бы он был меньше? Вот сток после вызова команда /orderlist:
P.s. прошу заметить, что максимальное кол-во заказов (строк) - 10! На 1 строку приходится где то 92+24 str = ~116 ячеек


stock ProductList(playerid)
{
new str[92+24], str2[1024];
for(new i = 1; i < Total_OrdersProduct; i++)
{
format(str, sizeof(str), "{33AA33}%i. {FFFFAD}%s. {FFFFFF}Продуктов: {269BD8}%d шт. {FFFFFF}Развозчиков: {269BD8}0\n", i, OrdersProduct[i][productName], OrdersProduct[i][productAmount]);
strcat(str2, str);
}
ShowPlayerDialog(playerid, 51, 2, "Заказы", str2, "Отметить", "Закрыть");
return true;
}

StevenH
21.12.2015, 12:24
Up(5sim)

VVWVV
21.12.2015, 15:58
На примере данной команды вы можете сделать оптимизацию вашего кода.



CMD:members(playerid, params[])
{
new family = PlayerInfo[playerid][pMember];
if (family == 0)
family = PlayerInfo[playerid][pLeader];
if (family == 0)
return SendClientMessage(playerid, COLOR_GREY, !"Вы не состоите ни в одной из банд/мафий/фракций.");
static const fmt_str[] = "\n{FFFFFF}%s | ID: %d | %s[%d]";
// Расчёт размера буфера для форматирования.
const buffer_size = sizeof(fmt_str)
+ (-2 + MAX_PLAYER_NAME)
+ (-2 + 5) // ID игрока, в будущих версиях SA:MP значение MAX_PLAYERS
// может увеличиться вплоть до 65535 (5 символов).
+ (-2 + 20)// Максимальная длина названия ранга - 20 символов (?)
// (если больше или меньше, ставьте своё значение).
+ (-2 + 2);// Номер ранга - не больше 10 (2 символа).
// Расчёт макс. количества строк в диалоге.
const MAX_ENTRIES = 2048 / buffer_size;
// Первая часть строки string будет упакованной, поэтому strcat
// будет автоматически упаковывать новые строки при добавлении их к string.
// Благодаря этому в string можно будет вместить в 4 раза больше текста.
static const first_str[] = !"Сотрудники Online:";
new string[buffer_size * MAX_ENTRIES];
string = first_str;
new string_len = sizeof(first_str) - 1;
new buffer[buffer_size];
// Проходим по всем игрокам и "запоминаем" нужных.
new players[MAX_ENTRIES], players_count = 0;
foreach(new i: Player)
{
//if (!IsAValidPlayer(i))
if (0 == gPlayerLogged[i])
continue;
if (PlayerInfo[i][pMember] != family)
continue;
players[players_count++] = i;
}
// Теперь в цикле проверяем ранги от 10 до 1.
if (players_count == 0)
goto show_dialog;
for (new rank = 11, x, i; --rank != 0;)
{
// Проходим по всем кэшированным игрокам.
for (x = -1; ++x < players_count;)
{
// Если у игрока искомый ранг - добавляем новую строку в диалог.
if ((i = players[x]) != rank)
continue;
format(
buffer, sizeof(string), fmt_str,
//PlayerInfo[i][pName], i,
//PlayerInfo[i][pRankName], PlayerInfo[i][pRank]
buffer, i, RankName(playerid), PlayerInfo[i][pRank]
);
// Добавить сформатированный результат к строке string
// и подсчитать её длину после добавления.
string_len += strcat(string, buffer);
// Если в организации много игроков и в string не хватает
// свободного места для новой строки - переходим к показу диалога.
if (string_len + sizeof(buffer) < sizeof(string))
continue;
goto show_dialog;
}
}
show_dialog:
//return SPD(playerid, 0, DSM, !"{00BFFF}Работники", string, !"Закрыть", !"");
return ShowPlayerDialog(
playerid, 0, DIALOG_STYLE_MSGBOX,
!"{00BFFF}Работники", string, !"Закрыть", !""
);
}

StevenH
21.12.2015, 16:39
На примере данной команды вы можете сделать оптимизацию вашего кода.

Спасибо, темку не закрывают, как буду дома - проверю