Просмотр полной версии : [Вопрос] Ошибки с Крашдетектора
[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];
Выход за пределы массива. Очевидно же, что возвращается -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.
switch(weaponid)
{
case 0..15,40,44..46: return true;
}
Вот код выше
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. Странно, но у вас получается какой-то не логический код.
Как было бы логично? (Можешь дать свой скайп?)
Как было бы логично? (Можешь дать свой скайп?)
У вас идёт отбор, и, если значение совпадает, то возвращает истину. Соответственно, все "плохие" значения после переработки оператор switch отдаёт функции Slot (которая не находит такое число, и возвращает -1), поэтому и возникает данная ошибка.
Как исправить? )
switch (weaponid)
{
case 0..15,40,44..46:
{
GunInfo[playerid][pAmmo][Slot(weaponid)] --;
}
default: return 0;
}
Сглупил (время: 3:10). Покажите, как вы инициализируете переменную weaponid.
От души )
- - - Добавлено - - -
Ща покажу
- - - Добавлено - - -
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;
}
От души )
- - - Добавлено - - -
Ща покажу
- - - Добавлено - - -
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:
Так как исправить? )
Ответ был дан. Ибо, мой код мог нарушить логику скрипта.
Вообще теперь убить не могу никого :D
Daniel_Cortez
16.03.2016, 05:48
new slotid = Slot(weaponid);
if (slotid != -1)
GunInfo[playerid][pAmmo][slotid] --;
Не работает.
switch (weaponid)
{
case 0..15,40,44..46:
{
new slotid = Slot(weaponid);
if (slotid != -1)
GunInfo[playerid][pAmmo][slotid] --;
}
default: return 0;
}
Не работает.
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] --;
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot