Вход

Просмотр полной версии : [Вопрос] Ошибки с Крашдетектора



DmX
16.03.2016, 03:34
[00:59:36] [debug] Run time error 4: "Array index out of bounds"
[00:59:36] [debug] Accessing element at negative index -1
[00:59:36] [debug] AMX backtrace:
[00:59:36] [debug] #0 0000f174 in public OnPlayerWeaponShot (playerid=6, weaponid=69, hittype=214, hitid=5530, Float:fX=0.00000, Float:fY=0.00000, Float:fZ=130148118036432518432168083456.00000) at C:\Users\1\Desktop\mod\gamemodes\mod.pwn:543


Ругается на строку

GunInfo[playerid][pAmmo][Slot(weaponid)] --;


stock Slot(w)
{
switch(w)
{
case 0,1: return 0;
case 2..9: return 1;
case 10..15: return 10;
case 16..18,39: return 8;
case 22..24: return 2;
case 25..27: return 3;
case 28,29,32: return 4;
case 30,31: return 5;
case 33,34: return 6;
case 35..38: return 7;
case 40: return 12;
case 41..43: return 9;
case 44..46: return 11;
}
return -1;
}


new GunInfo[MAX_PLAYERS][wInfo][13];

VVWVV
16.03.2016, 03:42
Выход за пределы массива. Очевидно же, что возвращается -1.

stock Slot(w)
{
switch(w)
{
case 0,1: return 0;
case 2..9: return 1;
case 10..15: return 10;
case 16..18,39: return 8;
case 22..24: return 2;
case 25..27: return 3;
case 28,29,32: return 4;
case 30,31: return 5;
case 33,34: return 6;
case 35..38: return 7;
case 40: return 12;
case 41..43: return 9;
case 44..46: return 11;
}
return -1;
}

Ищите ошибку в переменной weaponid.

DmX
16.03.2016, 03:48
switch(weaponid)
{
case 0..15,40,44..46: return true;
}

Вот код выше

VVWVV
16.03.2016, 03:52
switch(weaponid)
{
case 0..15,40,44..46: return true;
}

Вот код выше

Это ничего не дало, т.к. нужно значение переменной weaponid.


switch(weaponid)
{
case 0..15,40,44..46: return true;
}
GunInfo[playerid][pAmmo][Slot(weaponid)] --;
P.S. Странно, но у вас получается какой-то не логический код.

DmX
16.03.2016, 03:54
Как было бы логично? (Можешь дать свой скайп?)

VVWVV
16.03.2016, 04:03
Как было бы логично? (Можешь дать свой скайп?)

У вас идёт отбор, и, если значение совпадает, то возвращает истину. Соответственно, все "плохие" значения после переработки оператор switch отдаёт функции Slot (которая не находит такое число, и возвращает -1), поэтому и возникает данная ошибка.

DmX
16.03.2016, 04:04
Как исправить? )

VVWVV
16.03.2016, 04:07
Как исправить? )


switch (weaponid)
{
case 0..15,40,44..46:
{
GunInfo[playerid][pAmmo][Slot(weaponid)] --;
}
default: return 0;
}

Сглупил (время: 3:10). Покажите, как вы инициализируете переменную weaponid.

DmX
16.03.2016, 04:13
От души )

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

Ща покажу

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


public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
switch (weaponid)
{
case 0..15,40,44..46:
{
GunInfo[playerid][pAmmo][Slot(weaponid)] --;
}
default: return 0;
}

VVWVV
16.03.2016, 04:16
От души )

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

Ща покажу

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


public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
switch (weaponid)
{
case 0..15,40,44..46:
{
GunInfo[playerid][pAmmo][Slot(weaponid)] --;
}
default: return 0;
}

Мне казалось, что у вас там большая система - но нет. :victory:

DmX
16.03.2016, 04:21
Так как исправить? )

VVWVV
16.03.2016, 04:24
Так как исправить? )

Ответ был дан. Ибо, мой код мог нарушить логику скрипта.

DmX
16.03.2016, 05:26
Вообще теперь убить не могу никого :D

Daniel_Cortez
16.03.2016, 05:48
new slotid = Slot(weaponid);
if (slotid != -1)
GunInfo[playerid][pAmmo][slotid] --;

DmX
16.03.2016, 06:30
Не работает.


switch (weaponid)
{
case 0..15,40,44..46:
{
new slotid = Slot(weaponid);
if (slotid != -1)
GunInfo[playerid][pAmmo][slotid] --;
}
default: return 0;
}

VVWVV
16.03.2016, 08:12
Не работает.


switch (weaponid)
{
case 0..15,40,44..46:
{
new slotid = Slot(weaponid);
if (slotid != -1)
GunInfo[playerid][pAmmo][slotid] --;
}
default: return 0;
}

Вместо всего этого используйте:



new slotid = Slot(weaponid);
if (slotid != -1)
GunInfo[playerid][pAmmo][slotid] --;