Array index out of bounds
#1

Код:
CMD:makeadmin(playerid, params[])
{
    new AdminLevel;

    if(!IsPlayerConnected(targetid)) 
        return SendClientMessage(playerid, COLOR_RED, "ERROR: Player is not connected!");

    if(PlayerInfo[targetid][pAdmin] >= 3 || IsPlayerAdmin(playerid))
    {
        if(sscanf(params, "ui", targetid, AdminLevel))
            return SendClientMessage(playerid, -1, "USAGE: /makeadmin [ID] [LEVEL 1-4]");

        if(AdminLevel < 1 || AdminLevel > 4)
            return SendClientMessage(playerid, COLOR_RED, "ERROR: Invalid Admin level");

        SendClientMessageEx(playerid, COLOR_LAWNGREEN, "You've just been made: %s admin level: %i", ReturnName(targetid), AdminLevel);
        SendClientMessageEx(targetid, COLOR_LAWNGREEN, "You've just been made admin level: %i by %s", AdminLevel, ReturnName(playerid));

        PlayerInfo[targetid][pAdmin] = AdminLevel;
    }
    else return SendClientMessage(playerid, COLOR_RED, "ERROR: You are not an Admin!");

    return 1;
}
Gives me errors such as:



Why?
Reply
#2

Which array is sized 1000?
You are accessing it with index 65535, presumibly an invalid id.
Reply
#3

Quote:
Originally Posted by v1k1nG
Посмотреть сообщение
Which array is sized 1000?
You are accessing it with index 65535, presumibly an invalid id.
Don't have anything else other than the Stock functions

Код:
stock ReturnName(playerid, underScore = 1)
{
    new playersName[MAX_PLAYER_NAME + 2];
    GetPlayerName(playerid, playersName, sizeof(playersName));
 
    if(!underScore)
    {
        {
            for(new i = 0, j = strlen(playersName); i < j; i ++)
            {
                if(playersName[i] == '_')
                {
                    playersName[i] = ' ';
                }
            }
        }
    }
 
    return playersName;
}
stock SendClientMessageEx(playerid, color, const str[], {Float,_}:...)
{
    static
        args,
        start,
        end,
        string[156]
    ;
    #emit LOAD.S.pri 8
    #emit STOR.pri args
 
    if (args > 12)
    {
        #emit ADDR.pri str
        #emit STOR.pri start
 
        for (end = start + (args - 12); end > start; end -= 4)
        {
            #emit LREF.pri end
            #emit PUSH.pri
        }
        #emit PUSH.S str
        #emit PUSH.C 156
        #emit PUSH.C string
        #emit PUSH.C args
        #emit SYSREQ.C format
 
        SendClientMessage(playerid, color, string);
 
        #emit LCTRL 5
        #emit SCTRL 4
        #emit RETN
    }
    return SendClientMessage(playerid, color, str);
}
Reply
#4

The command was edited. An invalid player ID (65535) cannot pass the `IsPlayerConnected` check so it would never access the array.

Avoid using global variables that may be used inside functions (which are called from these commands) and you get unexpected results.

The logic is retrieving the player, checking if the player is connected, access arrays.

pawn Код:
new id, AdminLevel;

if(sscanf(params, "ui", id, AdminLevel)) return ...
if(!IsPlayerConnected(id)) return ...
if(AdminLevel < 1 || AdminLevel > 4) return ...

...

PlayerInfo[id][pAdmin] = AdminLevel;
where ... are your messages.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)