PDA

Просмотр полной версии : [Вопрос] Ошибка с SetPlayerExtra (Система оповещения)



vovandolg
29.11.2015, 04:08
Вот допустим у меня диалог с которым я работаю

case 667:
{
if(response)
{
if(!IsACop(playerid))
{
WantedPoints[playerid]+=2;
PlayerInfo[playerid][pWanted]+=2;
SetPlayerExtra(playerid,255, "Проникновение в хранилище банка");
SetPPos(playerid,2147.862,1601.332,1006.168);
SetPlayerInterior(playerid,1);
PlayerInfo[playerid][pInt] = 1;
SetPlayerVirtualWorld(playerid,3);
SetPlayerFacingAngle(playerid, 180.0);

}
}
}
Если убрать строчку

SetPlayerExtra(playerid,255, "Проникновение в хранилище банка");
То всё кашерно проходит, а с этим стоком(SetPlayerExtra) в логах ошибка высвечивается:

[02:33:26] [debug] Run time error 4: "Array index out of bounds"
[02:33:26] [debug] Accessing element at index 255 past array upper bound 49
[02:33:26] [debug] AMX backtrace:
[02:33:26] [debug] #0 000db2e4 in ?? (0, 255, 5422964) from beta39.amx
[02:33:26] [debug] #1 0006b834 in public OnDialogResponse (0, 667, 1, -1, 6420012) from beta39.amx

Вот сам stock SetPlayerExtra

stock SetPlayerExtra(playerid,declare,reason[])
{
if(IsPlayerConnected(playerid))
{
new turner[64];
strmid(PlayerCrime[playerid][pAccusedof], reason, 0, strlen(reason), 255);
if (declare == INVALID_PLAYER_ID)
{
format(turner, sizeof(turner), "Неизвестный");
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(turner), 255);
}
else
{
if(IsPlayerConnected(declare))
{
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
strmid(PlayerCrime[declare][pBplayer], PlayerInfo[declare][pNames], 0, strlen(PlayerInfo[declare][pNames]), 255);
strmid(PlayerCrime[declare][pAccusing], reason, 0, strlen(reason), 255);
}
}
SendMes(playerid,COLOR_LIGHTRED,"Вы совершили преступление: [%s]. Сообщил: %s.",reason,PlayerInfo[declare][pNames]);
if(PlayerInfo[playerid][pWanted] > 0)
{
new yesno;
if(PlayerInfo[playerid][pWanted] != 0) { if(gTeam[playerid] == 3) gTeam[playerid] = 4; yesno = 1; }
if(yesno)
{
SendMes(playerid,COLOR_YELLOW,"Текущий уровень розыска: %d", PlayerInfo[playerid][pWanted]);
SetPlayerWantedLevel(playerid, PlayerInfo[playerid][pWanted]);
foreach(Player,i)
{
if(IsPlayerConnected(i)) { if(IsACop(i) || IsACru(i)) SendMes(i,0xFEBC41AA,"[Рация] Подозреваемый: {E23F3F}%s{FEBC41}. Преступление: %s. Сообщает: %s.",PlayerInfo[playerid][pNames],reason,PlayerInfo[declare][pNames]); }
}
}
}
}//not connected
}

Кто подскажет в чём тут трабла?:dntknw:

Reim
29.11.2015, 15:57
Попробуй так


SetPlayerExtra(playerid,INVALID_PLAYER_ID,"Проникновение в хранилище банка");

$continue$
29.11.2015, 16:22
Подключите crashdetect и откомпилируйте мод с отладкой -d3


Также можно получить более подробную информацию (например строки кода, на которых происходит ошибка, имена функций, параметры и т.д.), скомпилировав скрипт в режиме отладки следующим образом:
Открыть блокнот и ввести "-d3" (без кавычек).
Сохранить файл как "pawn.cfg" (под именем указать параметр "Все файлы") в папку с Pawno.
Заново скомпилировать мод.

vovandolg
29.11.2015, 16:51
Подключите crashdetect и откомпилируйте мод с отладкой -d3

Он и так у меня стоит плагин этот и скомпилирован с такой отладкой) Юзер выше в правильном направлении пошёл, почти в правильном...


Попробуй так


SetPlayerExtra(playerid,INVALID_PLAYER_ID,"Проникновение в хранилище банка");

[15:44:11] [debug] Run time error 4: "Array index out of bounds"
[15:44:11] [debug] Accessing element at index 65535 past array upper bound 49
[15:44:11] [debug] AMX backtrace:
[15:44:11] [debug] #0 000db188 in ?? (3, 65535, 5422940) from beta39.amx
[15:44:11] [debug] #1 0006b7a0 in public OnDialogResponse (3, 667, 1, -1, 6419700) from beta39.amx
Попробовал подставить MAX_PLAYERS тоже вылетела эта шляпа Accessing element at index 65535 past array upper bound 49
Поставил MAX_PLAYERS-1 и заработал наполовину код, почему наполовину потому:

Вы совершили преступление: [Грабёж]. Сообщил: .
А должно выглядеть так:

Вы совершили преступление: [Грабёж]. Сообщил: Неизвестный.

$continue$
29.11.2015, 17:19
Он и так у меня стоит плагин этот и скомпилирован с такой отладкой) Юзер выше в правильном направлении пошёл, почти в правильном...



[15:44:11] [debug] Run time error 4: "Array index out of bounds"
[15:44:11] [debug] Accessing element at index 65535 past array upper bound 49
[15:44:11] [debug] AMX backtrace:
[15:44:11] [debug] #0 000db188 in ?? (3, 65535, 5422940) from beta39.amx
[15:44:11] [debug] #1 0006b7a0 in public OnDialogResponse (3, 667, 1, -1, 6419700) from beta39.amx
Попробовал подставить MAX_PLAYERS тоже вылетела эта шляпа Accessing element at index 65535 past array upper bound 49
Поставил MAX_PLAYERS-1 и заработал наполовину код, почему наполовину потому:

Вы совершили преступление: [Грабёж]. Сообщил: .
А должно выглядеть так:

Вы совершили преступление: [Грабёж]. Сообщил: Неизвестный.

Ткните мне пальцем где мод откомпилирован с отладккой -d3

vovandolg
29.11.2015, 17:28
Ткните мне пальцем где мод откомпилирован с отладккой -d3

Типо тыыкаю)):
rghost (http://rghost.ru/6SV988BC6.view)

L0ndl3m
29.11.2015, 18:15
Наводка: У вас вызов функции SendMes: аргумент "declare" может быть совершенно любым числом. Из-за этого и выход за пределы массива.

Sp1ke
29.11.2015, 18:19
Типо тыыкаю)):
rghost (http://rghost.ru/6SV988BC6.view)

wtf?

Open pawn.cfg
-3d
Down:
http://rghost.ru/8WpjcqcJ6

L0ndl3m
29.11.2015, 18:34
ТС, попробуйте заменить эту часть кода:


if (declare == INVALID_PLAYER_ID)
{
format(turner, sizeof(turner), "Неизвестный");
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(turner), 255);
}
else
{
if(IsPlayerConnected(declare))
{
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
strmid(PlayerCrime[declare][pBplayer], PlayerInfo[declare][pNames], 0, strlen(PlayerInfo[declare][pNames]), 255);
strmid(PlayerCrime[declare][pAccusing], reason, 0, strlen(reason), 255);
}
}
SendMes(playerid,COLOR_LIGHTRED,"Вы совершили преступление: [%s]. Сообщил: %s.",reason,PlayerInfo[declare][pNames]);

на эту:


if (declare == INVALID_PLAYER_ID)
{
format(turner, sizeof(turner), "Неизвестный");
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(turner), 255);
}
else
{
if(IsPlayerConnected(declare))
{
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
strmid(PlayerCrime[declare][pBplayer], PlayerInfo[declare][pNames], 0, strlen(PlayerInfo[declare][pNames]), 255);
strmid(PlayerCrime[declare][pAccusing], reason, 0, strlen(reason), 255);
SendMes(playerid,COLOR_LIGHTRED,"Вы совершили преступление: [%s]. Сообщил: %s.",reason,PlayerInfo[declare][pNames]);
}
}

vovandolg
29.11.2015, 19:14
на эту:


if (declare == INVALID_PLAYER_ID)
{
format(turner, sizeof(turner), "Неизвестный");
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(turner), 255);
}
else
{
if(IsPlayerConnected(declare))
{
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), 255);
strmid(PlayerCrime[declare][pBplayer], PlayerInfo[declare][pNames], 0, strlen(PlayerInfo[declare][pNames]), 255);
strmid(PlayerCrime[declare][pAccusing], reason, 0, strlen(reason), 255);
SendMes(playerid,COLOR_LIGHTRED,"Вы совершили преступление: [%s]. Сообщил: %s.",reason,PlayerInfo[declare][pNames]);
}
}

И что мы сделаем?
Уберём мессейдж если будет неизвестный...
Может лучше if (declare == MAX_PLAYERS) так прописать?

$continue$
29.11.2015, 20:26
Могу только предложить:
1) Вывести все не ясные моменты на экран с помощью print/printf
2) Подключить crashdetect и наконец - то показать логи с отладкой -d3

vovandolg
30.11.2015, 04:15
наконец - то показать логи с отладкой -d3
Ввёл этот ключ чисто и та же ошибка вылезает в логах, сделал вот так короче:

new turner[64];
strmid(PlayerCrime[playerid][pAccusedof], reason, 0, strlen(reason), MAX_PLAYERS-1);
if(declare == MAX_PLAYERS-1)
{
format(turner, sizeof(turner), "Неизвестный");
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(turner), MAX_PLAYERS-1);
SendMes(playerid,COLOR_LIGHTRED,"Вы совершили преступление: [%s]. Сообщил: Неизвестный.",reason);
}
else
{
if(IsPlayerConnected(declare))
{
strmid(PlayerCrime[playerid][pVictim], PlayerInfo[playerid][pNames], 0, strlen(PlayerInfo[playerid][pNames]), MAX_PLAYERS-1);
strmid(PlayerCrime[declare][pBplayer], PlayerInfo[declare][pNames], 0, strlen(PlayerInfo[declare][pNames]), MAX_PLAYERS-1);
strmid(PlayerCrime[declare][pAccusing], reason, 0, strlen(reason), MAX_PLAYERS-1);
SendMes(playerid,COLOR_LIGHTRED,"Вы совершили преступление: [%s]. Сообщил: %s.",reason,PlayerInfo[declare][pNames]);
}
}
Работает без ошибок и наверняка, может как то declare можно было бы заменить на другое значение(чтобы конкретно не выходило за границы)?