PDA

Просмотр полной версии : [Вопрос] Оптимизация



ALIT13
27.03.2018, 21:07
Как можно оптимизировать такой код

stock GetPlayerRank(playerid)
{
new rangz[40];
switch(PlayerInfo[playerid][pMember])
{
case 0: rangz = "Нет";
case 1,10,21:
{
switch(PlayerInfo[playerid][pRank])
{
case 15: rangz = "Шериф";
case 14: rangz = "Полковник";
case 13: rangz = "Подполковник";
case 12: rangz = "Майор";
case 11: rangz = "Капитан";
case 10: rangz = "Детектив";
case 9: rangz = "Лейтенант";
case 8: rangz = "Мл. Лейтенант";
case 7: rangz = "Ст. Прапорщик";
case 6: rangz = "Прапорщик";
case 5: rangz = "Ст. Сержант";
case 4: rangz = "Сержант";
case 3: rangz = "Мл. Сержант";
case 2: rangz = "Офицер";
case 1: rangz = "Кадет";
}
}
case 5:
{
switch(PlayerInfo[playerid][pRank])
{
case 10: rangz = "Дон";
case 9: rangz = "Консильери";
case 8: rangz = "Младший Босс";
case 7: rangz = "Капо";
case 6: rangz = "Сотто-Капо";
case 5: rangz = "Боец";
case 4: rangz = "Солдато";
case 3: rangz = "Сомбаттенте";
case 2: rangz = "Ассосиато";
case 1: rangz = "Новицио";
}
}
case 22:
{
switch(PlayerInfo[playerid][pRank])
{
case 7: rangz = "Президент";
case 6: rangz = "Sergeant-at-arms";
case 5: rangz = "Road captain";
case 4: rangz = "Member";
case 3: rangz = "Prospect";
case 2: rangz = "Hang around";
case 1: rangz = "Support";
}
}
case 12:
{
switch(PlayerInfo[playerid][pRank])
{
case 10: rangz = "Биг Вилли";
case 9: rangz = "Райч Нига";
case 8: rangz = "Фолкс";
case 7: rangz = "Федерал Блок";
case 6: rangz = "Гангстер";
case 5: rangz = "Ап Бро";
case 4: rangz = "Гун брo";
case 3: rangz = "Крэкер";
case 2: rangz = "Младший Нига";
case 1: rangz = "Блайд";
}
}
case 17:
{
switch(PlayerInfo[playerid][pRank])
{
case 10: rangz = "Падре";
case 9: rangz = "Нестро";
case 8: rangz = "Тесосеро";
case 7: rangz = "Инвасор";
case 6: rangz = "Сабио";
case 5: rangz = "Мирандо";
case 4: rangz = "Лас Геррас";
case 3: rangz = "Геттор";
case 2: rangz = "Тирадор";
case 1: rangz = "Перро";
}
}
case 18:
{
switch(PlayerInfo[playerid][pRank])
{
case 10: rangz = "Падре";
case 9: rangz = "Аджунто";
case 8: rangz = "Ауторидад";
case 7: rangz = "Бандидо";
case 6: rangz = "Эрмано";
case 5: rangz = "Джуниор";
case 4: rangz = "Мачo";
case 3: rangz = "Амиго";
case 2: rangz = "Ладрон";
case 1: rangz = "Новато";
}
}
case 13:
{
switch(PlayerInfo[playerid][pRank])
{
case 11: rangz = "Падре";
case 10: rangz = "Падрино";
case 9: rangz = "Лидер V.E.G.";
case 8: rangz = "Асесор";
case 7: rangz = "Авторитарио";
case 6: rangz = "Асесино";
case 5: rangz = "Амиго";
case 4: rangz = "Эстимадо";
case 3: rangz = "Сольдадо";
case 2: rangz = "Криминаль";
case 1: rangz = "Новато";
}
}
case 15:
{
switch(PlayerInfo[playerid][pRank])
{
case 10: rangz = "Мэд Дог";
case 9: rangz = "Легенд";
case 8: rangz = "Де Кинг";
case 7: rangz = "Мобста";
case 6: rangz = "О.Г.";
case 5: rangz = "Гангста";
case 4: rangz = "Юонг";
case 3: rangz = "Килла";
case 2: rangz = "Хастла";
case 1: rangz = "Плэйя";
}
}
case 14:
{
switch(PlayerInfo[playerid][pRank])
{
case 8: rangz = "Вор в законе";
case 7: rangz = "Авторитет";
case 6: rangz = "Смотрящи";
case 5: rangz = "Вор";
case 4: rangz = "Жиган";
case 3: rangz = "Вышибала";
case 2: rangz = "Фраер";
case 1: rangz = "Шнырь";
}
}
case 6:
{
switch(PlayerInfo[playerid][pRank])
{
case 10: rangz = "Кумитё";
case 9: rangz = "Оябун-кобун";
case 8: rangz = "Cайко комон";
case 7: rangz = "Оядзи";
case 6: rangz = "Камбу";
case 5: rangz = "Со-хобунтё";
case 4: rangz = "Вакагасира";
case 3: rangz = "Сятейгасира";
case 2: rangz = "Кёдай";
case 1: rangz = "Вакасю";
}
}
case 9:
{
switch(PlayerInfo[playerid][pRank])
{
case 6: rangz = "Главный редактор";
case 5: rangz = "Редактор";
case 4: rangz = "Журналист";
case 3: rangz = "Папарацци";
case 2: rangz = "Фотограф";
case 1: rangz = "Стажер";
}
}
case 8:
{
switch(PlayerInfo[playerid][pRank])
{
case 5: rangz = "Директор";
case 4: rangz = "Зам. директора";
case 3: rangz = "Крупье";
case 2: rangz = "Охранник";
case 1: rangz = "Чипер";
}
}
case 3,19:
{
switch(PlayerInfo[playerid][pRank])
{
case 16: rangz = "Генерал";
case 15: rangz = "Полковник";
case 14: rangz = "Подполковник";
case 13: rangz = "Ма";
case 12: rangz = "Капитан";
case 11: rangz = "Старший лейтенант";
case 10: rangz = "Лейтенант";
case 9: rangz = "Младший лейтенант";
case 8: rangz = "Старший прапорщик";
case 7: rangz = "Прапорщик";
case 6: rangz = "Старшина";
case 5: rangz = "Ст. Сержант";
case 4: rangz = "Сержант";
case 3: rangz = "Мл. Сержант";
case 2: rangz = "Ефрейтор";
case 1: rangz = "Рядовой";
}
}
case 2:
{
switch(PlayerInfo[playerid][pRank])
{
case 9: rangz = "Директор";
case 8: rangz = "Зам. директора";
case 7: rangz = "Инспектор";
case 6: rangz = "Начальник секции";
case 5: rangz = "Специальный агент";
case 4: rangz = "Старший агент";
case 3: rangz = "Агент";
case 2: rangz = "Мл.Агент";
case 1: rangz = "Стажёр";
}
}
case 7:
{
switch(PlayerInfo[playerid][pRank])
{
case 17: rangz = "Губернатор";
case 16: rangz = "Советник Губернатора";
case 15: rangz = "Министр Культуры";
case 14: rangz = "Зам. Министра Культуры";
case 13: rangz = "Министр Транспорта";
case 12: rangz = "Зам.Министра Транспорта";
case 11: rangz = "Министр Финансов";
case 10: rangz = "Зам.Министр Финансов";
case 9: rangz = "Министр Юстиции";
case 8: rangz = "Зам. Министра Юстиции";
case 7: rangz = "Сотрудник Министерства";
case 6: rangz = "Прокурор";
case 5: rangz = "Адвокат";
case 4: rangz = "Начальник СБ";
case 3: rangz = "Зам.Начальника СБ";
case 2: rangz = "Водитель";
case 1: rangz = "Охраник";
}
}
case 23:
{
switch(PlayerInfo[playerid][pRank])
{
case 5: rangz = "Директор ";
case 4: rangz = "Зам.Директор";
case 3: rangz = "Начальник Охраны";
case 2: rangz = "Старщий Охранник";
case 1: rangz = "Охранник";
}
}
case 4:
{
switch(PlayerInfo[playerid][pRank])
{
case 8: rangz = "Глав. врач";
case 7: rangz = "Терапевт";
case 6: rangz = "Хирург";
case 5: rangz = "Педиатр";
case 4: rangz = "Санитар";
case 3: rangz = "Интерн";
case 2: rangz = "Стажёр";
case 1: rangz = "Практикант";
}
}
}
return rangz;
}

DeimoS
27.03.2018, 21:41
Вынести название рангов в массив, тем самым избавится от лишнего копирования информации в стэк (в массив rangz).
Как-то так:

new const fracRankList_PD[][] =
{
"Кадет",
"Офицер",
"Мл. Сержант",
"Сержант",
"Ст. Сержант",
"Прапорщик",
"Ст. Прапорщик",
"Мл. Лейтенант",
"Лейтенант",
"Детектив",
"Капитан",
"Майор",
"Подполковник",
"Полковник",
"Шериф"
};

new const fracRankList_LCN[][] =
{
"Новицио",
"Ассосиато",
"Сомбаттенте",
"Солдато",
"Боец",
"Сотто-Капо",
"Капо",
"Младший Бос",
"Консильери",
"Дон"
};


stock GetPlayerRank(playerid)
{
new rank = PlayerInfo[playerid][pRank];

switch(PlayerInfo[playerid][pMember])
{
case 1, 10, 21:
{
if(1 <= rank <= sizeof(fracRankList_PD))
{
return fracRankList_PD[rank-1];
}

}
case 5:
{
if(1 <= rank <= sizeof(fracRankList_LCN))
{
return fracRankList_LCN[rank-1];
}
}
}

static const
fract_none[] = "Нет";
return fract_none;
}

ALIT13
27.03.2018, 22:20
return fract_none;

error 047: array sizes do not match, or destination array is too small

DeimoS
28.03.2018, 09:35
Ну ожидаемо.
Лучше всего будет переписать всю систему получения номера ранга, сразу получая его прямо из переменной, без всяких функций. Все остальные попытки сделать универсальную функцию либо увеличат потребление памяти, либо придется терять в производительности и читаемости