Просмотр полной версии : [Вопрос] 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);
Очень странно, что вы не заметили вот эту тему (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 добавил буквально только что, основываясь на вашем примере.
Не нужно тут ничего увеличивать. 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)
Естественно читал, но у вас там пример другой у вас там есть констант 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
Сделаю, тогда как поступать с 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
Всем всем спасибо, особенно Пельмень, ведь именно его способ помог мне.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot