PDA

Просмотр полной версии : [Вопрос] Выход за пределы



vovandolg
05.01.2016, 17:58
В коннекте таймер замутил:


SetTimerEx("LoadConnect",17500,0,"d",playerid);
Далее примерно такая конструкция кода:


forward LoadConnect(playerid);
public LoadConnect(playerid)
{
format(mysql_query,sizeof(mysql_query),"SELECT `Name` FROM `Accounts` WHERE `Name` = '%s'",PlayerInfo[playerid][pNames]);
mysql_function_query(connects, mysql_query,true,"PlayerRegCheck","d",playerid);
RemoveBuildingForPlayer(playerid, 8229, 1142.0313, 1362.5000, 12.4844, 0.25);
URL[playerid] = TextDrawCreate(509.000000, 3.000000, "RP");// íàçâàíèå, è êîîðäèíàòû
TextDrawFont(URL[playerid], 1);// ñòèëü òåêñòà
TextDrawColor(URL[playerid], COLOR_ULTI);//öâåò òåêñòà - ãîëóáîé
TextDrawLetterSize(URL[playerid], 0.3600, 1.500000);// ðàçìåðû
TextDrawSetOutline(URL[playerid], 2);
TextDrawShowForPlayer(playerid, URL[playerid]);
FPS[playerid] = TextDrawCreate(8.000000, 428.000000, "FPS: 30");
TextDrawBackgroundColor(FPS[playerid], 255);
TextDrawFont(FPS[playerid], 3);
TextDrawLetterSize(FPS[playerid], 0.280000, 1.500000);
TextDrawColor(FPS[playerid], COLOR_ULTI);
TextDrawSetOutline(FPS[playerid], 2);
TextDrawSetProportional(FPS[playerid], 1);
//==============================================
Text[playerid] = TextDrawCreate(400.0, 10.0, "Text");
TextDrawBackgroundColor(Text[playerid], COLOR_BLACK);
TextDrawColor(Text[playerid], 0x0BB814FF);
TextDrawFont(Text[playerid], 3);
//==============================================
Bar1 = CreateProgressBar(playerid,468.00,420.00,100.00,4.00,0xFFA600AA,100.0);
HideProgressBar(playerid,Bar1);
Bar2 = CreateProgressBar(playerid,548.00,28.00,60.00,3.20,0x0265B6AA,100.0);
HideProgressBar(playerid,Bar2);
PlayerTimerID[playerid] = SetTimerEx("PlayerUpdate", 250, 1, "d", playerid);
return 1;
}

Когда на сервер входит 24ый игрок или выше вот такие ошибки в логах:


[16:45:25] [debug] Run time error 4: "Array index out of bounds"
[16:45:25] [debug] Accessing element at index 24 past array upper bound 23
[16:45:25] [debug] AMX backtrace:
[16:45:25] [debug] #0 0027368c in public LoadConnect (24) from beta41.amx

Выход за пределы вижу, но где он скрывается я не пойму:dntknw:

Desulaid
05.01.2016, 18:02
Но ведь загрузку можно делать всего один раз, а ТД создавать при коннекте 9((

vovandolg
05.01.2016, 18:23
Но ведь загрузку можно делать всего один раз, а ТД создавать при коннекте 9((

Я просто увидел в каком то коде что ТД при коннекте создают вот и делаю так, а что в этом плохого?

VVWVV
05.01.2016, 18:44
Очевидно же, что из-за playerid происходит выход за пределы массива, и нам необходимо искать все, что связанно с ним. В вашем коде большое количество разнообразных массивов, которые используют playerid. Во-первых, проверьте все массивы на максимальный размер; если увидите число 23, то это тот массив, который нам нужен. Далее, нам нужно изменить максимальный размер данного массива на MAX_PLAYERS.

Во-вторых, вам необходимо прочитать:


Как бороться с выходами за пределы массива (CrashDetect) (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)

^_^
05.01.2016, 18:46
Покажи код обьявления массивов URL, FPS, Text и PlayerTimerID.

vovandolg
05.01.2016, 18:55
Text:URL[MAX_PLAYERS]
Text:Text[MAX_PLAYER_NAME]
PlayerTimerID[MAX_PLAYERS]

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


Во-первых, проверьте все массивы на максимальный размер; если увидите число 23, то это тот массив, который нам нужен. Далее, нам нужно изменить максимальный размер данного массива на MAX_PLAYERS.
[/LIST][/INDENT]

Таких цифр нету уже проверял до того как выложить =( Вот и пишу сюда..

^_^
05.01.2016, 19:04
Text:Text[MAX_PLAYER_NAME] ошибка тут.
Константа MAX_PLAYER_NAME и равна 24.
Решение:

Text:Text[MAX_PLAYERS]

vovandolg
05.01.2016, 19:25
А для чего [MAX_PLAYER_NAME] использовать лучше всего?
Помимо GetPlayerName

Desulaid
05.01.2016, 19:33
А для чего [MAX_PLAYER_NAME] использовать лучше всего?
Помимо GetPlayerName


if(strlen(name) < MAX_PLAYER_NAME && strlen(name) > 5)
{
SendClientMessage(playerid, -1, "У вас шикарное количество символов в имени!");
}

DeimoS
05.01.2016, 19:43
А для чего [MAX_PLAYER_NAME] использовать лучше всего?
Помимо GetPlayerName

Эмм, советую прочесть статьи о макросах, ибо Вы совсем не имеете представления о том, что это такое, как я вижу