PDA

Просмотр полной версии : [Вопрос] Ошибка записи\чтения массива



Nikitos112
21.10.2016, 08:38
Доброго времени суток. У меня крашит сервер с ошибкой:

00:32:00] [debug] Run time error 4: "Array index out of bounds"
[00:32:00] [debug] Attempted to read/write array element at index 65535 in array of size 1000
[00:32:00] [debug] AMX backtrace:
[00:32:00] [debug] #0 0013e148 in public Fresh () at C:\Users\Nik\Desktop\Самп серв\gamemodes\Role_Play_.pwn:21859
[00:32:00] [debug] #1 0032b52c in public TimerUpdate () at C:\Users\Nik\Desktop\Самп серв\gamemodes\Role_Play_.pwn:40137

[22:27:58] [debug] Run time error 4: "Array index out of bounds"
[22:27:58] [debug] Attempted to read/write array element at index 65535 in array of size 1000
[22:27:58] [debug] AMX backtrace:
[22:27:58] [debug] #0 002ca68c in public OnPlayerCommandText (playerid=2, cmdtext[]=@00761f8c "/goto 1") at C:\Users\Nik\Desktop\Самп серв\gamemodes\Role_Play_.pwn:34837


public TimerUpdate() Fresh(); Но crashdetect указывает ниже данного паблика (public TimerUpdate () at ...........pwn:40137 )


40137: foreach(Player,playerid)

Команда /goto

else if(strcmp(cmd, "/goto", true) == 0 || strcmp(cmd, "/g", true) == 0)
{
tmp = strcharsplit(cmdtext, idx);
if(!strlen(tmp) && PlayerInfo[playerid][pAdmin] >= 2) return SendClientMessage(playerid, COLOR_WHITE, " Ââåäèòå: /g(oto) [id èãðîêà]");
new Float:plocx,Float:plocy,Float:plocz;
new plo = ReturnUser(tmp);
if(PlayerInfo[plo][pAdmin] >= 15) return SendClientMessage(playerid,COLOR_GREY,"Íåâîçìîæíîå äåéñòâèå");
if (!IsPlayerConnected(plo)) return SendClientMessage(playerid, COLOR_GREY, "[Îøèáêà] Èãðîê íå íàéäåí!");
{
if(plo != INVALID_PLAYER_ID)
{
if(PlayerInfo[playerid][pAdmin] >= 2)
{ //указывает на эту строчку
if(specid != INVALID_PLAYER_ID) specid = 256;
if(toggotome[plo] == 1 && PlayerInfo[playerid][pAdmin] < 13) return SendClientMessage(playerid,COLOR_RED," Àäìèíèñòðàòîð çàïðåòèë ê íåìó òåëåïîðòèðîâàòüñÿ!");
if(GetPlayerState(plo) != 1 && GetPlayerState(plo) != 2 && GetPlayerState(plo) != 3) return SendClientMessage(playerid, COLOR_GRAD1, "Èãðîê íå âñòóïèë â èãðó!");
if(GetPlayerState(plo) == PLAYER_STATE_SPECTATING && gSpectateID[plo] != INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_GRAD1, "Àäìèí â ðåæèìå íàáëþäåíèÿ");
GetPlayerPos(plo, plocx, plocy, plocz);
if (GetPlayerState(playerid) == 2)
{
new tmpcar = GetPlayerVehicleID(playerid);
SetVehiclePos(tmpcar, plocx, plocy+4, plocz);
TelePos[playerid][0] = 0.0; TelePos[playerid][1] = 0.0;
}
else
{
SetPPos(playerid,plocx,plocy+2, plocz);
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(plo));
SetPlayerInterior(playerid, GetPlayerInterior(plo));
PlayerInfo[playerid][pInt] = GetPlayerInterior(plo);
}
SendClientMessage(playerid, COLOR_WHITE, "Âû áûëè òåëåïîðòèðîâàíû!");
}
else { SendClientMessage(playerid, COLOR_GRAD1, "Âû íå óïîëíîìî÷åíû èñïîëüçîâàòü ýòó êîìàíäó!"); }
}
}
return true;
}


Частично Fresh ():

if(hour == 00 || hour == 03 || hour == 06 || hour == 09 || hour == 12 || hour == 15 || hour == 18 || hour == 21)
{
if(minute == 32 && second == 00)
{
new houser = 0;
for(new h = 0; h < sizeof(HouseInfo); h++)
{
if(HouseInfo[h][hKlass] == 0 && HouseInfo[h][hOwned] == 1)//Êëàññû äîìîâ
{
HouseInfo[h][hTakings] -=50; kazna += 50;
if(HouseInfo[h][hTakings] > 16800) HouseInfo[h][hTakings] = 16800;
}
if(HouseInfo[h][hKlass] == 1 && HouseInfo[h][hOwned] == 1)//Êëàññû äîìîâ
{
HouseInfo[h][hTakings] -=100; kazna += 100;
if(HouseInfo[h][hTakings] > 33600) HouseInfo[h][hTakings] = 33600;
}
if(HouseInfo[h][hKlass] == 2 && HouseInfo[h][hOwned] == 1)//Êëàññû äîìîâ
{
HouseInfo[h][hTakings] -=150; kazna += 150;
if(HouseInfo[h][hTakings] > 50400) HouseInfo[h][hTakings] = 50400;
}
if(HouseInfo[h][hKlass] == 3 && HouseInfo[h][hOwned] == 1)//Êëàññû äîìîâ
{
HouseInfo[h][hTakings] -=200; kazna += 200;
if(HouseInfo[h][hTakings] > 67200) HouseInfo[h][hTakings] = 67200;
}
if(HouseInfo[h][hKlass] == 4 && HouseInfo[h][hOwned] == 1)//Êëàññû äîìîâ
{
HouseInfo[h][hTakings] -=300; kazna += 300;
if(HouseInfo[h][hTakings] > 84000) HouseInfo[h][hTakings] = 84000;
}
if(HouseInfo[h][hKlass] == 6 && HouseInfo[h][hOwned] == 1)//Êëàññû äîìîâ
{
HouseInfo[h][hTakings] -=400; kazna += 400;
if(HouseInfo[h][hTakings] > 100000) HouseInfo[h][hTakings] = 100000;
}
if(HouseInfo[h][hTakings] <= 0 && HouseInfo[h][hOwned] == 1)
{
new housecash = HouseInfo[h][hValue];
new playeridd = GetPlayerID(HouseInfo[h][hOwner]);
if(IsPlayerConnected(playeridd)) { PlayerInfo[playeridd][pPhousekey] = 255; SendClientMessage(playeridd, COLOR_LIGHTRED, " Âàø äîì áûë ïðîäàí çà íåóïëàòó ãîñóäàðòñâó."); }
else if(!IsPlayerConnected(playeridd))
{
new mysql_query[128];
format(mysql_query, sizeof(mysql_query), "UPDATE `accounts` SET `pPhousekey` = '255', `pHousecash` = '%d' WHERE `Name` = '%s'",housecash, HouseInfo[h][hOwner]);
mysql_function_query(connects, mysql_query, false, "", "");
}
HouseInfo[h][hHel] = 0;
HouseInfo[h][hLock] = 1; // указывает на эту строку
HouseInfo[h][hArended] = 0;
if(caridhouse[playeridd] != 0)
{
DestroyVehicle(caridhouse[playeridd]);
caridhouse[playeridd] = 0;
}
if(caridhouse2[playeridd] != 0)
{
DestroyVehicle(caridhouse2[playeridd]);
caridhouse2[playeridd] = 0;
}
if(HouseInfo[h][hHolod] == 1)DestroyDynamicCP(HouseInfo[h][hHolodd]),HouseInfo[h][hHolod] = 0;
if(HouseInfo[h][hSafe] == 1)
{
DestroyDynamicCP(HouseInfo[h][hObjsafe][0]);
DestroyDynamicObject(HouseInfo[h][hObjsafe][1]);
DestroyDynamic3DTextLabel(HouseInfo[h][hSafee]);
HouseInfo[h][hSafe] = 0;
}
for(new i = 0; i<9;i++){HouseInfo[h][hProducts][i] = 0;}
HouseInfo[h][hOwned] = 0; // Óñòàíàâëèàåì äîìó: Âëàäåëüöà áåç ïðàâ ê äîìó (ïóñòîé äîì) .
HouseInfo[h][hHel] = 0; // Óñòàíàâëèàåì äîìó: 0 àïòå÷åê .
HouseInfo[h][hTakings] = 0; // Óñòàíàâëèàåì äîìó: 0 äîìàøíèé ñ÷¸ò .
HouseInfo[h][hLock] = 1;
strmid(HouseInfo[h][hOwner], "The State", 0, strlen("The State"), 255); // Óñòàíàâëèàåì äîìó: Âëàäåëüöà ñ èìåíåì THE STATE (ïóñòîé äîì) .
BuyHousee(); // Îòïðàâëÿåì ôóíêöèþ BuyHouse (ðàáîòà ñ èêîíêàìè) .
SaveHouse(h);
}
if(HouseInfo[h][hOwned] == 0)
{
DestroyDynamicMapIcon(HouseInfo[h][hMIcon]);
HouseInfo[h][hMIcon] = CreateDynamicMapIcon(HouseInfo[h][hEnterhou][0], HouseInfo[h][hEnterhou][1], HouseInfo[h][hEnterhou][2], 31, COLOR_WHITE, 0, -1, -1, 200.0);
}
if(HouseInfo[h][hOwned] == 1)
{
DestroyDynamicMapIcon(HouseInfo[h][hMIcon]);
HouseInfo[h][hMIcon] = CreateDynamicMapIcon(HouseInfo[h][hEnterhou][0], HouseInfo[h][hEnterhou][1], HouseInfo[h][hEnterhou][2], 32, COLOR_WHITE, 0, -1, -1, 200.0);
}
}
new stringer[fk_str];
format(stringer,sizeof(stringer),"{FFa500}[Info] Ïðîäàíî {fff700}%d {ffa500}äîìîâ",houser);
ABroadCast(COLOR_LIGHTRED,stringer,1);
}
}

Надеюсь на вашу помощь.

DeimoS
21.10.2016, 09:43
http://pro-pawn.ru/showthread.php?12957-%D0%9A%D0%B0%D0%BA-%D0%B1%D0%BE%D1%80%D0%BE%D1%82%D1%8C%D1%81%D1%8F-%D1%81-%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8-%D0%B7%D0%B0-%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%8B-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0-%28CrashDetect%29

qwezert
21.10.2016, 11:30
40137: foreach(Player,playerid) Это что за инициализация форича такая интересная?

if (!IsPlayerConnected(plo)) return SendClientMessage(playerid, COLOR_GREY, "[Îøèáêà] Èãðîê íå íàéäåí!");
{
if(plo != INVALID_PLAYER_ID)
{
А это еще что за чудо кодинга? Это что РЛС что ли?

- - - Добавлено - - -



else if(strcmp(cmd, "/goto", true) == 0 || strcmp(cmd, "/g", true) == 0)
{
tmp = strcharsplit(cmdtext, idx);
if(!strlen(tmp) && PlayerInfo[playerid][pAdmin] >= 2) return SendClientMessage(playerid, COLOR_WHITE, " Ââåäèòå: /g(oto) [id èãðîêà]");
new Float:plocx,Float:plocy,Float:plocz;
new plo = ReturnUser(tmp);

//Первыми нужно делать проверки на условия при которых команда работать не должна, что бы не путатся потом в скобочках. Удобнее и понятнее.
//if(plo == INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_GREY, "INVALID PLAYER ID!"); Эта проверка не нужна, так как если будет неверный id проверка IsPlayerConnected вернет false и не сработает условие.
if (!IsPlayerConnected(plo)) return SendClientMessage(playerid, COLOR_GREY, "[Îøèáêà] Èãðîê íå íàéäåí!");
if(PlayerInfo[plo][pAdmin] >= 15) return SendClientMessage(playerid,COLOR_GREY,"Íåâîçìîæíîå äåéñòâèå");
if(PlayerInfo[playerid][pAdmin] < 2) return SendClientMessage(playerid, COLOR_GRAD1, "Âû íå óïîëíîìî÷åíû èñïîëüçîâàòü ýòó êîìàíäó!");


if(specid != INVALID_PLAYER_ID) specid = 256; // Что это за гавно я так и не понял
if(toggotome[plo] == 1 && PlayerInfo[playerid][pAdmin] < 13) return SendClientMessage(playerid,COLOR_RED," Àäìèíèñòðàòîð çàïðåòèë ê íåìó òåëåïîðòèðîâàòüñÿ!");
if(GetPlayerState(plo) != 1 && GetPlayerState(plo) != 2 && GetPlayerState(plo) != 3) return SendClientMessage(playerid, COLOR_GRAD1, "Èãðîê íå âñòóïèë â èãðó!");
if(GetPlayerState(plo) == PLAYER_STATE_SPECTATING && gSpectateID[plo] != INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_GRAD1, "Àäìèí â ðåæèìå íàáëþäåíèÿ");
GetPlayerPos(plo, plocx, plocy, plocz);
if (GetPlayerState(playerid) == 2)
{
new tmpcar = GetPlayerVehicleID(playerid);
SetVehiclePos(tmpcar, plocx, plocy+4, plocz);
TelePos[playerid][0] = 0.0; TelePos[playerid][1] = 0.0;
}
else
{
SetPPos(playerid,plocx,plocy+2, plocz);
SetPlayerVirtualWorld(playerid, GetPlayerVirtualWorld(plo));
SetPlayerInterior(playerid, GetPlayerInterior(plo));
PlayerInfo[playerid][pInt] = GetPlayerInterior(plo);
}
SendClientMessage(playerid, COLOR_WHITE, "Âû áûëè òåëåïîðòèðîâàíû!");

return true;
}

ПОфиксил

- - - Добавлено - - -

Да и вообще поставь себе командный процессор(dc_cmd,pawn.cmd,izcmd) - а то в 2016 юзать стандартный это зашквар.

Daniel_Cortez
21.10.2016, 12:04
if(specid != INVALID_PLAYER_ID) specid = 256; // Что это за гавно я так и не понял

Скорее всего, это осталось ещё с тех времён, когда макс. длина ника составляла 16 символов, а сервер вмещал до 256 игроков (0-255, т.е. 256 был неправильным ID, хотя можно было использовать -1 с расчётом на увеличение макс. онлайна в будущем). Легаси-код, он такой.

Nikitos112
21.10.2016, 20:59
Благодарю, вопрос решен.