PDA

Просмотр полной версии : [Вопрос] Массивы в ранге



$continue$
14.06.2015, 16:38
Доброго времени суток, уважаемые посетители Pro Pawn!
У меня проблема, выводится не то ранг который должен.


static const RankName[18][17][35] =
{
// LSPD
{"1) Отсутсвует",
"Кадет",
"Офицер",
"Мл. Сержант",
"Сержант",
"Ст. Сержант",
"Прапорщик",
"Ст. Прапорщик",
"Мл. Лейтенант",
"Лейтенант",
"Ст. Лейтенант",
"Капитан",
"Майор",
"Подполковник",
"Полковник",
"Шериф",
"2) Отсутсвует"},
// FBI
{"3) Отсутсвует",
"Стажёр",
"Агент",
"Старший агент",
"Специальный агент",
"Начальник секции",
"Инспектор",
"Зам. директора",
"Директор",
"3) Отсутсвует",
"3) Отсутсвует",
"3) Отсутсвует",
"3) Отсутсвует",
"3) Отсутсвует",
"3) Отсутсвует",
"3) Отсутсвует",
"3) Отсутсвует"},
// Авианосец
{"Отсутсвует",
"Юнга",
"Матрос",
"Ст. Матрос",
"Старшина",
"Гл. Старшина",
"Боцман",
"Прапорщик",
"Мичман",
"Ст. Мичман",
"Мл. Лейтенант",
"Лейтенант",
"Ст. Лейтенант",
"Капитан-лейтенант",
"Контр-адмирал",
"Вице-адмирал",
"Адмирал"},
// Больница ЛС
{"Отсутсвует",
"Интерн",
"Санитар",
"Мед.брат",
"Нарколог",
"Психолог",
"Хирург",
"Зам.Глав.Врача",
"Глав. Врач",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// LCNN
{"Отсутсвует",
"Новицио",
"Ассосиато",
"Сомбаттенте",
"Солдато",
"Боец",
"Сотто-Капо",
"Капо",
"Младший Босс",
"Консильери",
"Дон",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// Yakuza
{"Отсутсвует",
"Вакасю",
"Кёдай",
"Сятейгасира",
"Вакагасира",
"Со-хобунтё",
"Камбу",
"Оядзи",
"Cайко комон",
"Оябун-кобун",
"Кумитё",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// Мэрия ЛС
{"0) Отсутсвует",
"Адвокат",
"Судья",
"Охранник",
"Нач.Охраны",
"Депутат",
"Министр",
"Советник",
"Зам. мэра",
"Мэр",
"1) Отсутсвует",
"2) Отсутсвует",
"3) Отсутсвует",
"4) Отсутсвует",
"5) Отсутсвует",
"6) Отсутсвует",
"7) Отсутсвует"},
// Армия ЛС
{"Отсутсвует",
"Рядовой",
"Ефрейтор",
"Младший сержант",
"Сержант",
"Старший сержант",
"Старшина",
"Прапорщик",
"Старший прапорщик",
"Младший лейтенант",
"Лейтенант",
"Старший лейтенант",
"Капитан",
"Майор",
"Подполковник",
"Полковник",
"Генерал"},
// SFPD
{"Отсутсвует",
"Кадет",
"Офицер",
"Мл. Сержант",
"Сержант",
"Ст. Сержант",
"Прапорщик",
"Ст. Прапорщик",
"Мл. Лейтенант",
"Лейтенант",
"Ст. Лейтенант",
"Капитан",
"Майор",
"Подполковник",
"Полковник",
"Шериф",
"Отсутсвует"},
//Инстуркторы
{"Отсутсвует",
"Стажёр",
"Экзаменатор",
"Инструктор",
"Кординатор",
"Мл. менеджер",
"Старший менеджер",
"Директор",
"Управляющий",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// The Ballas
{"Отсутсвует",
"Блайд",
"Младший Нига",
"Крэкер",
"Гун брo",
"Ап Бро",
"Гангстер",
"Федерал Блок",
"Фолкс",
"Райч Нига",
"Биг Вилли",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// Los Santos Vagos
{"Отсутсвует",
"Новато",
"Бандито",
"Сольдадо",
"Эстимадо",
"Амиго",
"Асесино",
"Асесор",
"Лидер V.E.G.",
"Падрино",
"Падре",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// Russian Mafia
{"Отсутсвует",
"Шнырь",
"Фраер",
"Бык",
"Барыга",
"Блатной",
"Свояк",
"Браток",
"Вор",
"Вор в законе",
"Авторитет",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// Grove Street
{"Отсутсвует",
"Плэйя",
"Хастла",
"Килла",
"Юонг",
"Гангста",
"О.Г.",
"Мобста",
"Де Кинг",
"Легенд",
"Мэд Дог",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
//LS News
{"Отсутсвует",
"Стажер",
"Фотограф.",
"Папарацци",
"Журналист",
"Редактор",
"Главный редактор",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// Varios Los Aztecas
{"Отсутсвует",
"Перро",
"Тирадор",
"Геттор",
"Лас Геррас",
"Мирандо",
"Сабио",
"Инвасор",
"Тесосеро",
"Нестро",
"Падре",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// The Rifa
{"Отсутсвует",
"Новато",
"Ладрон",
"Амиго",
"Мачo",
"Джуниор",
"Эрмано",
"Бандидо",
"Ауторидад",
"Аджунто",
"Падре",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует",
"Отсутсвует"},
// Зона 51
{"Отсутсвует",
"Рядовой",
"Ефрейтор",
"Младший сержант",
"Сержант",
"Старший сержант",
"Старшина",
"Прапорщик",
"Старший прапорщик",
"Младший лейтенант",
"Лейтенант",
"Старший лейтенант",
"Капитан",
"Майор",
"Подполковник",
"Полковник",
"Генерал"}
};



new fraction_id = PlayerInfo[playerid][p_members] - 1,
rang = PlayerInfo[playerid][p_rang],
sample[35];

sample = RankName[fraction_id][rang];

Выводит у мэрий 1) отсутствует

Пельмень
14.06.2015, 19:21
delete

$continue$
14.06.2015, 20:01
Не знаю как уровнять, что бы без добавление ещё одного ранга, поможет кто?

Daniel_Cortez
14.06.2015, 20:13
Я не знаю всех подробностей вашей системы рангов, да и времени на это сейчас нет.
Тем не менее, могу предложить свою систему (мне она уже вряд ли пригодится).


#define MAX_RANK 10
#define MAX_FAMILIES 4
#define MAX_FAMILY_NAME 16
#define MAX_FAMILY_NAME2 MAX_FAMILY_NAME+1
new const FamNames[1+MAX_FAMILIES][MAX_FAMILY_NAME] =
{
{"-"},
{"Полиция"},
{"ФБР"},
{"Армия"},
{"Служба спасения"}
};
new const FamNames2[1+MAX_FAMILIES][MAX_FAMILY_NAME2] =
{
{"-"},
{"Полиции"},
{"F.B.I"},
{"Армии"},
{"Службы спасения"}
};
#define RankName(%1) _RankNames[GetRankIdx(%1)]
stock GetRankIdx(playerid)
{
new family = PlayerInfo[playerid][pMember];
if(family == 0)
family = PlayerInfo[playerid][pLeader];
if(!(1<=family<=MAX_FAMILIES))
return 0;
return (family-1)*(MAX_RANK)+PlayerInfo[playerid][pRank];
}
#define MAX_RANK_NAME 24
new const _RankNames[1+MAX_FAMILIES*MAX_RANK][MAX_RANK_NAME] =
{
{"-"}, // для обращений к таблице в случае, если игрок нигде не состоит
// Полиция
{"Кадет"},
{"Старшина"},
{"Прапорщик"},
{"Сотрудник П.О.В."},
{"Начальник кадетов"},
{"Комиссар"},
{"Следователь"},
{"Полковник"},
{"Зам. Министра МВД"},
{"Министр МВД"},
// ФБР
{"Ученик школы F.B.I."},
{"Младший агент"},
{"Агент нац. безопасности"},
{"Секретный агент"},
{"Глава ГБР"},
{"Глава ГНК"},
{"Зам. дир. школы F.B.I."},
{"Директор школы F.B.I."},
{"Зам. директора F.B.I."},
{"Директор F.B.I."},
// Армия
{"Рядовой"},
{"Ефрейтор"},
{"Сержант"},
{"Прапорщик"},
{"Лейтенант"},
{"Капитан"},
{"Майор"},
{"Полковник"},
{"Зам. министра обороны"},
{"Министр обороны"},
// МЧС
{"Медбрат"},
{"Интерн"},
{"Санитар"},
{"Терапевт"},
{"Доктор"},
{"Хирург"},
{"Психиатр"},
{"Заместитель"},
{"Заведующий"},
{"Глав. врач"}

Суть в том, что нужно иметь чётко фиксированное количество рангов в каждой организации (здесь этих рангов 10) - тогда не придётся делать кучу ветвлений и городить лишние структуры данных.

$continue$
14.06.2015, 20:23
Я не знаю всех подробностей вашей системы рангов, да и времени на это сейчас нет.
Тем не менее, могу предложить свою систему (мне она уже вряд ли пригодится).


#define MAX_RANK 10
#define MAX_FAMILIES 4
#define MAX_FAMILY_NAME 16
#define MAX_FAMILY_NAME2 MAX_FAMILY_NAME+1
new const FamNames[1+MAX_FAMILIES][MAX_FAMILY_NAME] =
{
{"-"},
{"Полиция"},
{"ФБР"},
{"Армия"},
{"Служба спасения"}
};
new const FamNames2[1+MAX_FAMILIES][MAX_FAMILY_NAME2] =
{
{"-"},
{"Полиции"},
{"F.B.I"},
{"Армии"},
{"Службы спасения"}
};
#define RankName(%1) _RankNames[GetRankIdx(%1)]
stock GetRankIdx(playerid)
{
new family = PlayerInfo[playerid][pMember];
if(family == 0)
family = PlayerInfo[playerid][pLeader];
if(!(1<=family<=MAX_FAMILIES))
return 0;
return (family-1)*(MAX_RANK)+PlayerInfo[playerid][pRank];
}
#define MAX_RANK_NAME 24
new const _RankNames[1+MAX_FAMILIES*MAX_RANK][MAX_RANK_NAME] =
{
{"-"}, // для обращений к таблице в случае, если игрок нигде не состоит
// Полиция
{"Кадет"},
{"Старшина"},
{"Прапорщик"},
{"Сотрудник П.О.В."},
{"Начальник кадетов"},
{"Комиссар"},
{"Следователь"},
{"Полковник"},
{"Зам. Министра МВД"},
{"Министр МВД"},
// ФБР
{"Ученик школы F.B.I."},
{"Младший агент"},
{"Агент нац. безопасности"},
{"Секретный агент"},
{"Глава ГБР"},
{"Глава ГНК"},
{"Зам. дир. школы F.B.I."},
{"Директор школы F.B.I."},
{"Зам. директора F.B.I."},
{"Директор F.B.I."},
// Армия
{"Рядовой"},
{"Ефрейтор"},
{"Сержант"},
{"Прапорщик"},
{"Лейтенант"},
{"Капитан"},
{"Майор"},
{"Полковник"},
{"Зам. министра обороны"},
{"Министр обороны"},
// МЧС
{"Медбрат"},
{"Интерн"},
{"Санитар"},
{"Терапевт"},
{"Доктор"},
{"Хирург"},
{"Психиатр"},
{"Заместитель"},
{"Заведующий"},
{"Глав. врач"}

Суть в том, что нужно иметь чётко фиксированное количество рангов в каждой организации (здесь этих рангов 10) - тогда не придётся делать кучу ветвлений и городить лишние структуры данных.
Это конечно, хорошо, но у меня не фиксированная система рангов.
И не хотелось бы их уравнивать, может ещё есть предложения? :)

Daniel_Cortez
14.06.2015, 21:04
#define MAX_RANK 10
#define MAX_FAMILIES 2
#define MAX_FAMILY_NAME 16
#define MAX_FAMILY_NAME2 MAX_FAMILY_NAME+1
#define MAX_RANK_NAME 24

enum e_FAMILY_INFO
{
fiFamilyName[MAX_FAMILY_NAME],
fiFamilyName2[MAX_FAMILY_NAME2],
fiTotalRanks, // 1 <= x <= MAX_RANK
fiRankNames[MAX_RANK][MAX_RANK_NAME]
};

new const family_info[MAX_FAMILIES][e_FAMILY_INFO] =
{
// Армия
{
{"Армия"}, {"Армии"}, 10,
{
{"Рядовой"},
{"Ефрейтор"},
{"Сержант"},
{"Прапорщик"},
{"Лейтенант"},
{"Капитан"},
{"Майор"},
{"Полковник"},
{"Зам. министра обороны"},
{"Министр обороны"}
}
},
// Служба спасения
{
{"Служба спасения"}, {"Службы спасения"}, 9,
{
{"Санитар"},
{"Медбрат"},
{"Интерн"},
{"Терапевт"},
{"Доктор"},
{"Хирург"},
{"Зав. отделением"},
{"Глав. врач"},
{"-"}
}
}
};

Самое простое, что приходит в голову. Тем не менее, на имена несуществующих рангов тоже выделится по MAX_RANK_NAME ячеек.

Я бы расписал пару способов, которые позволят этого избежать, но это будет дикое извращение с макросами, в которых 10 строк - трюки с enum/#define/#undef и всего 2-3 - содержимое, связанное с именами рангов.
IMHO, лучше пожертвовать парой байтов, чем получить непонятную кашу из чего-то, что сложно даже назвать кодом. Всему надо знать меру.

$continue$
14.06.2015, 21:15
fiRankNames[MAX_RANK][MAX_RANK_NAME]

C:\╙ы№ЄЁр Ёя\gamemodes\new.pwn(22451) : error 001: expected token: "}", but found "["

Нельзя же вроде в enum использовать двухмерный массив?

Daniel_Cortez
14.06.2015, 21:24
Нельзя двумерные массивы в enum? Не знал (раньше у меня не было особой необходимости в них).

Что ж, план B: попробуйте хранить имена рангов в отдельном массиве.
Либо попробуйте последнюю версию компилятора от Zeex (https://github.com/Zeex/pawn/releases). Я помню, он не так давно добавил поддержку 4-мерных массивов и инициализацию 2-мерных при объявлении. Кто знает, может какие-то изменения затронули и объявление массивов в enum.

$continue$
14.06.2015, 21:36
Нельзя двумерные массивы в enum? Не знал (раньше у меня не было особой необходимости в них).

Что ж, план B: попробуйте хранить имена рангов в отдельном массиве.
Либо попробуйте последнюю версию компилятора от Zeex (https://github.com/Zeex/pawn/releases). Я помню, он не так давно добавил поддержку 4-мерных массивов и инициализацию 2-мерных при объявлении. Кто знает, может какие-то изменения затронули и объявление массивов в enum.

С компилятором дело - не прокатило :)
Но это конечно, если я все верно сделал.

__________________________________________________________________

Если я Вас правильно понял то:


enum e_FAMILY_INFO
{
fiFamilyName[MAX_FAMILY_NAME],
fiFamilyName2[MAX_FAMILY_NAME2],
fiTotalRanks, // 1 <= x <= MAX_RANK
fiRankNames[MAX_RANK][MAX_RANK_NAME]
};
new const family_info[MAX_FAMILIES][e_FAMILY_INFO];
static const family_info_two[MAX_FAMILIES][e_FAMILY_INFO]
{
// Армия
{
{"Армия"}, {"Армии"}, 10,
{
{"Рядовой"},
{"Ефрейтор"},
{"Сержант"},
{"Прапорщик"},
{"Лейтенант"},
{"Капитан"},
{"Майор"},
{"Полковник"},
{"Зам. министра обороны"},
{"Министр обороны"}
}
},
// Служба спасения
{
{"Служба спасения"}, {"Службы спасения"}, 9,
{
{"Санитар"},
{"Медбрат"},
{"Интерн"},
{"Терапевт"},
{"Доктор"},
{"Хирург"},
{"Зав. отделением"},
{"Глав. врач"},
{"-"}
}
}
};


C:\╙ы№ЄЁр Ёя\gamemodes\new.pwn(22451) : error 001: expected token: "}", but found "["
C:\╙ы№ЄЁр Ёя\gamemodes\new.pwn(22452) : error 010: invalid function or declaration
C:\╙ы№ЄЁр Ёя\gamemodes\new.pwn(22455) : error 001: expected token: ";", but found "{"
C:\╙ы№ЄЁр Ёя\gamemodes\new.pwn(22457) : error 055: start of function body without function header
C:\╙ы№ЄЁр Ёя\gamemodes\new.pwn(22473) : error 055: start of function body without function header
C:\╙ы№ЄЁр Ёя\gamemodes\new.pwn(22487) : error 010: invalid function or declaration

[/php]

Daniel_Cortez
14.06.2015, 22:04
Не совсем, в enum нужно убрать поле fiRankNames, ну и названия рангов из family_info.
Затем сделать массив family_ranks размером MAX_FAMILIES*MAX_RANK (одномерный) и в него вписать все ранги (в т.ч. и лишние пустые названия).

$continue$
14.06.2015, 23:33
Решено! Можно закрыть!
Особое спасибо Cтасу (Daniel'y Cortez'у)