PDA

Просмотр полной версии : [Вопрос] Run time error 4: "Array index out of bounds"



DoN_SancheS
24.12.2016, 19:09
Вот такая ошибка в логах

[connection] 82.199.202.119:60643 requests connection cookie.
[16:54:32] [connection] incoming connection: 82.199.202.119:60643 id: 0
[16:54:32] [join] wInnER has joined the server (0:82.199.202.119)
[16:54:46] [debug] Run time error 4: "Array index out of bounds"
[16:54:46] [debug] Attempted to read/write array element at index 1000 in array of size 100
[16:54:46] [debug] AMX backtrace:
[16:54:46] [debug] #0 00069fd0 in public OnPlayerLogin (playerid=0, password[]=@0015f448 "PAROL999") at C:\Users\Karen\Desktop\SERV\gamemodes\new.pwn:5520
[16:54:46] [debug] #1 000e0100 in public OnDialogResponse (playerid=0, dialogid=1, response=1, listitem=-1, inputtext[]=@0015b874 "PAROL999") at C:\Users\Karen\Desktop\SERV\gamemodes\new.pwn:11367


Вот строка 5520 (5512-5522)


}
else { if(PlayerInfo[playerid][pPhousekey] != 1000) { PlayerInfo[playerid][pPhousekey] = 1000; } }
format(string2, sizeof(string2), "~w~šO€PO ŒO„A‡O‹A’ ~n~~g~ %s", PlayerName[playerid]);
GameTextForPlayer(playerid, string2, 5000, 1);
gPlayerLogged[playerid] = 1;
SetSpawnInfoPlayer(playerid);
SpawnPlayer(playerid);
SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]);
for(new i = 0; i < sizeof(HouseInfo); i++) SetPlayerMapIcon(playerid, i,HouseInfo[PlayerInfo[playerid][pPhousekey]][hEntrancex], HouseInfo[PlayerInfo[playerid][pPhousekey]][hEntrancey], HouseInfo[PlayerInfo[playerid][pPhousekey]][hEntrancez],35,-1,1);
return true;
}

А вот строка 11367 (11366-11367)


strmid(tpass, inputtext, 0, strlen(inputtext), 255);
OnPlayerLogin(playerid,tpass);

VVWVV
24.12.2016, 20:12
Очень странно, что вы не заметили вот эту тему (http://pro-pawn.ru/showthread.php?12957). Кроме того, на данном сайте очень много вопросов, связанных именно с выходом за пределы массива.

В вашем же случае необходимо увеличить массив HouseInfo.

Почему именно массив HouseInfo? Потому что вы сами изменяете значение PlayerInfo[playerid][pPhousekey] на 1000.


else { if(PlayerInfo[playerid][pPhousekey] != 1000) { PlayerInfo[playerid][pPhousekey] = 1000; } }


P.S. RLS-подобный код на данном сайте не приветствуется...

Daniel_Cortez
24.12.2016, 20:45
Очень странно, что вы не заметили вот эту тему (http://pro-pawn.ru/showthread.php?12957). Кроме того, на данном сайте очень много вопросов, связанных именно с выходом за пределы массива.

В вашем же случае необходимо увеличить массив HouseInfo.

Почему именно массив HouseInfo? Потому что вы сами изменяете значение PlayerInfo[playerid][pPhousekey] на 1000.


else { if(PlayerInfo[playerid][pPhousekey] != 1000) { PlayerInfo[playerid][pPhousekey] = 1000; } }


P.S. RLS-подобный код на данном сайте не приветствуется...
Не нужно тут ничего увеличивать. 1000 явно означает неправильный ID дома, т.е. если pPhousekey равен 1000, у игрока нет дома. Нужно просто добавить проверку на наличие дома и все дела.

ТС настоятельно рекоменую посмотреть пункты 7, 8 и 9 в этой теме: http://pro-pawn.ru/showthread.php?8347
Пункт 9 добавил буквально только что, основываясь на вашем примере.

VVWVV
24.12.2016, 20:47
Не нужно тут ничего увеличивать. 1000 явно означает неправильный ID дома, т.е. если pPhousekey равен 1000, у игрока нет дома. Нужно просто добавить проверку на наличие дома и все дела.

Как-то странно делать такое...

Daniel_Cortez
24.12.2016, 20:50
Как-то странно делать такое...
Да, это странно брать число 1000 за неправильный ID дома - мало того, что никому кроме автора не известное "магическое число", так ещё и положительное. В своих рекомендациях (как раз в новом 9-м пункте) я уже описал этот антипаттерн.

DoN_SancheS
24.12.2016, 21:38
Не нужно тут ничего увеличивать. 1000 явно означает неправильный ID дома, т.е. если pPhousekey равен 1000, у игрока нет дома. Нужно просто добавить проверку на наличие дома и все дела.

ТС настоятельно рекоменую посмотреть пункты 7, 8 и 9 в этой теме: http://pro-pawn.ru/showthread.php?8347
Пункт 9 добавил буквально только что, основываясь на вашем примере.

Daniel Спасибо за твою работу, но чтобы не напортачить, так сейчас я должен взять и просто везде где есть
if(PlayerInfo[playerid][pPhousekey] != 1000) изменить 1000 на -1?

Daniel_Cortez
24.12.2016, 21:42
Daniel Спасибо за твою работу, но чтобы не напортачить, так сейчас я должен взять и просто везде где есть
if(PlayerInfo[playerid][pPhousekey] != 1000) изменить 1000 на -1?
Не люблю отвечать вопросом на вопрос, но вы точно читали пункты 7 и 8?

DoN_SancheS
24.12.2016, 21:46
Не люблю отвечать вопросом на вопрос, но вы точно читали пункты 7 и 8?

Естественно читал, но у вас там пример другой у вас там есть констант INVALID_HOUSE_ID а у меня нет такого, у меня просто в нескольких местах
if(PlayerInfo[playerid][pPhousekey] != 1000)

DeimoS
25.12.2016, 13:07
Естественно читал, но у вас там пример другой у вас там есть констант INVALID_HOUSE_ID а у меня нет такого, у меня просто в нескольких местах
if(PlayerInfo[playerid][pPhousekey] != 1000)

Ну так создайте эту константу и уже используйте её, вместо пресловутого "1000"

DoN_SancheS
25.12.2016, 14:53
Ну так создайте эту константу и уже используйте её, вместо пресловутого "1000"

Сделаю, тогда как поступать с if(PlayerInfo[playerid][pPhousekey] != 1000) ?
В смысле что на что поменять, а вообще ошибка на строке 5520
где есть вот это
[hEntrancez],35,-1,1); может дело вообще не связанно с if(PlayerInfo[playerid][pPhousekey] != 1000)

Пельмень
25.12.2016, 21:04
Ну давай предположим что у тебя HouseInfo[MAX_HOUSES][eHouseInfo]; где MAX_HOUSES = 100, правильно?
Здесь ты присваиваешь переменной значение 1000

PlayerInfo[playerid][pPhousekey] = 1000;
А например здесь получаешь доступ к HouseInfo[1000]

HouseInfo[PlayerInfo[playerid][pPhousekey]][hEntrancex]
Ибо PlayerInfo[playerid][pPhousekey] ты присвоил 1000 до этого
Соответственно либо меняй PlayerInfo[playerid][pPhousekey] на значение от 0 до 99, либо увеличивай свой псевдо MAX_HOUSES на 1001

Seviel
27.12.2016, 18:47
Сделаю, тогда как поступать с if(PlayerInfo[playerid][pPhousekey] != 1000) ?
В смысле что на что поменять, а вообще ошибка на строке 5520
где есть вот это
[hEntrancez],35,-1,1); может дело вообще не связанно с if(PlayerInfo[playerid][pPhousekey] != 1000)
Вот так может быть?
p.s. сделал переменную так как путался.
p.s.s. на оффю сайте сказано что можно только 100 иконок вывести, используй лучше streamer.


new key = PlayerInfo[playerid][pPhousekey];
for(new i = 0; i < sizeof(HouseInfo); i++) SetPlayerMapIcon(playerid, i, HouseInfo[key][hEntrancex], HouseInfo[key][hEntrancey], HouseInfo[key][hEntrancez], 35, -1, MAPICON_LOCAL);

DoN_SancheS
30.12.2016, 12:50
Всем всем спасибо, особенно Пельмень, ведь именно его способ помог мне.