PDA

Просмотр полной версии : [Вопрос] ошибка 033: массив должен быть проиндексирован (переменная "-unknown-")



execution
25.04.2018, 21:36
Не понимаю в чём может быть причина.
#define Name(%0) PlayerInfo[%0][pNames]

enum _:e_BATTLE_RESULT
{
BATTLE_PLAYER_LOSS = 0,
BATTLE_PLAYER_WIN,
BATTLE_PLAYER_TIME_OUT,
BATTLE_PLAYER_DISCONNECT,
BATTLE_PLAYER_LEAVE
}

stock FinishPlayer_Battle(playerid, type)
{
new
BATTLE_RESULT[e_BATTLE_RESULT][/PHP],
_result[][] =
{
"Поражение над",
"Победили",
"Не найден соперник",
"Вышел из игры",
"Зону сражения покинул"
};

switch(type)
{
case 0: _enemy_cout = 1;
case 1: _enemy_cout = 0;
case 3: _enemy_cout = 3;
case 4: _enemy_cout = 4;
}

format(string, 100, "[PVP]: Сражение подошло к концу. Результат: {FFFFFF}%s %s", _result[_enemy_cout], type == BATTLE_RESULT[BATTLE_PLAYER_TIME_OUT] ? (Name(playerid)) : ("")); // Тут ошибка. Когда убираю тернарник - всё норм.
return SendClientMessage(plaeyerid, -1, string);
}

Использую так:
FinishPlayer_Battle(playerid, BATTLE_RESULT[BATTLE_PLAYER_DISCONNECT]);

UPD: Когда юзаю так, всё нормально:
new
reason[MAX_PLAYER_NAME + 1];

if(type == BATTLE_RESULT[BATTLE_PLAYER_TIME_OUT])
strcat(reason, Name(playerid));
else
reason = "";

format(string, 144, "[PVP]: Сражение подошло к концу. Результат: {FFFFFF}%s %s", _result[_enemy_cout], reason);
return SendClientMessage(playerid, 0xE5C62DFF, string);

StevenH
25.04.2018, 21:44
format(string, 100, "[PVP]: Сражение подошло к концу. Результат: {FFFFFF}%s %s", _result[_enemy_cout], (type == BATTLE_RESULT[BATTLE_PLAYER_TIME_OUT]) ? Name(playerid) : (""));

execution
25.04.2018, 21:47
Не, всё равно.

pawnoholic
26.04.2018, 06:44
У перечислений не может быть тэгов.

Не правильно


enum _:e_BATTLE_RESULT
{
...
}


Правильно:



enum e_BATTLE_RESULT
{
...
}

execution
26.04.2018, 08:10
У перечислений не может быть тэгов.

Не правильно


enum _:e_BATTLE_RESULT
{
...
}


Правильно:



enum e_BATTLE_RESULT
{
...
}


Дело не в этом, всё равно такая же ошибка.

DeimoS
26.04.2018, 12:28
У перечислений не может быть тэгов.

Не правильно


enum _:e_BATTLE_RESULT
{
...
}


Правильно:



enum e_BATTLE_RESULT
{
...
}


Вообще может :) Точнее, когда ты делаешь вот так:

enum e_BATTLE_RESULT
{
...
}
ты, по сути, делаешь вот так:

enum e_BATTLE_RESULT:e_BATTLE_RESULT
{
...
}

Вот такой код:

enum e_BATTLE_RESULT
{
...
};
new test[e_BATTLE_RESULT];

main()
{
printf("%d", test[1]);
}
Выдаст предупреждение о несовпадении тэгов. А если явно указать целочисленный тэг, как это делает автор, то уже предупреждения не будет

Автор, что-то не совсем понятно как ты можешь вызывать функцию таким образом:

FinishPlayer_Battle(playerid, BATTLE_RESULT[BATTLE_PLAYER_DISCONNECT]);
Если массив BATTLE_RESULT объявлен внутри функции FinishPlayer_Battle

Собрал код в new.pwn и всё прекрасно компилируется после добавления недостающих переменных и испраления одной опечатки с "plaeyerid"
https://i.imgur.com/UBDe2im.png

execution
26.04.2018, 14:24
Вообще может :) Точнее, когда ты делаешь вот так:

enum e_BATTLE_RESULT
{
...
}
ты, по сути, делаешь вот так:

enum e_BATTLE_RESULT:e_BATTLE_RESULT
{
...
}

Вот такой код:

enum e_BATTLE_RESULT
{
...
};
new test[e_BATTLE_RESULT];

main()
{
printf("%d", test[1]);
}
Выдаст предупреждение о несовпадении тэгов. А если явно указать целочисленный тэг, как это делает автор, то уже предупреждения не будет

Автор, что-то не совсем понятно как ты можешь вызывать функцию таким образом:

FinishPlayer_Battle(playerid, BATTLE_RESULT[BATTLE_PLAYER_DISCONNECT]);
Если массив BATTLE_RESULT объявлен внутри функции FinishPlayer_Battle

Собрал код в new.pwn и всё прекрасно компилируется после добавления недостающих переменных и испраления одной опечатки с "plaeyerid"
https://i.imgur.com/UBDe2im.png

Массив BATTLE_RESULT обьявил глобальео, просто тут так получилось.

На счет проблем с тернарником - подсказали, что это баг компилятора. Использую VS Code в котоом компилятор от Zeex, но как видимо старая версия. Спасибо.