dcmd/sscanf Probleme

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hey ich hab ein Problem mit
    dcmd/sscanf , entweder bin ich einfach zum dumm
    um den Fehler zu finden oder ich hab ihrgendwas vergessen.


    Also oben erstmal dcmd difiniert:


    #define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1


    die Befehle :


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(setscore,8,cmdtext);
    dcmd(givemoney,9,cmdtext);
    .....


    die Wirkung der Befehle:


    dcmd_setscore(playerid,params[])
    {
    new pplayerid, sscore;
    if(pInfo[playerid][admin] < 1)
    {
    SendClientMessage(playerid,0xFF0000FF,"Du darfst diesen Befehl nicht nutzen!");
    }
    else
    {
    if(sscanf(params,"ud",pplayerid,sscore))
    {
    SendClientMessage(playerid,0xFF0000FF," [Benutzung]: /setscore [id] [score] ");
    }
    if(!IsPlayerConnected(pplayerid))
    {
    SendClientMessage(playerid,0xFF0000FF," Spieler nicht online!");
    }
    if(pInfo[playerid][admin] >= 4)
    {
    SetPlayerScore(pplayerid, sscore);
    }
    }
    return 1;
    }


    dcmd_givemoney(playerid,params[])
    {
    new pplayerid, mmoney;
    if(pInfo[playerid][admin] < 1)
    {
    SendClientMessage(playerid,0xFF0000FF,"Du darfst diesen Befehl nicht nutzen!");
    }
    else
    {
    if(sscanf(params,"ud",pplayerid,mmoney))
    {
    SendClientMessage(playerid,0xFF0000FF," [Benutzung]: /givemoney [id] [menge] ");
    }
    if(!IsPlayerConnected(pplayerid))
    {
    SendClientMessage(playerid,0xFF0000FF," Spieler nicht online!");
    }
    if(pInfo[playerid][admin] >= 4)
    {
    GivePlayerMoney(pplayerid,mmoney);
    }
    }
    return 1;
    }




    Hier sscanf:
    /*----------------------------------------------------------------------------*-
    Function:
    sscanf
    Params:
    string[] - String to extract parameters from.
    format[] - Parameter types to get.
    {Float,_}:... - Data return variables.
    Return:
    0 - Successful, not 0 - fail.
    Notes:
    A fail is either insufficient variables to store the data or insufficient
    data for the format string - excess data is disgarded.


    A string in the middle of the input data is extracted as a single word, a
    string at the end of the data collects all remaining text.


    The format codes are:


    c - A character.
    d, i - An integer.
    h, x - A hex number (e.g. a colour).
    f - A float.
    s - A string.
    z - An optional string.
    pX - An additional delimiter where X is another character.
    '' - Encloses a litteral string to locate.
    u - User, takes a name, part of a name or an id and returns the id if they're connected.


    Now has IsNumeric integrated into the code.


    Added additional delimiters in the form of all whitespace and an
    optioanlly specified one in the format string.
    -*----------------------------------------------------------------------------*/


    stock sscanf(string[], format[], {Float,_}:...)
    {
    #if defined isnull
    if (isnull(string))
    #else
    if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
    {
    return format[0];
    }
    #pragma tabsize 4
    new
    formatPos = 0,
    stringPos = 0,
    paramPos = 2,
    paramCount = numargs(),
    delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
    stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
    switch (format[formatPos++])
    {
    case '\0':
    {
    return 0;
    }
    case 'i', 'd':
    {
    new
    neg = 1,
    num = 0,
    ch = string[stringPos];
    if (ch == '-')
    {
    neg = -1;
    ch = string[++stringPos];
    }
    do
    {
    stringPos++;
    if ('0' <= ch <= '9')
    {
    num = (num * 10) + (ch - '0');
    }
    else
    {
    return -1;
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num * neg);
    }
    case 'h', 'x':
    {
    new
    num = 0,
    ch = string[stringPos];
    do
    {
    stringPos++;
    switch (ch)
    {
    case 'x', 'X':
    {
    num = 0;
    continue;
    }
    case '0' .. '9':
    {
    num = (num << 4) | (ch - '0');
    }
    case 'a' .. 'f':
    {
    num = (num << 4) | (ch - ('a' - 10));
    }
    case 'A' .. 'F':
    {
    num = (num << 4) | (ch - ('A' - 10));
    }
    default:
    {
    return -1;
    }
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num);
    }
    case 'c':
    {
    setarg(paramPos, 0, string[stringPos++]);
    }
    case 'f':
    {


    new changestr[16], changepos = 0, strpos = stringPos;
    while(changepos < 16 && string[strpos] && string[strpos] != delim)
    {
    changestr[changepos++] = string[strpos++];
    }
    changestr[changepos] = '\0';
    setarg(paramPos,0,_:floatstr(changestr));
    }
    case 'p':
    {
    delim = format[formatPos++];
    continue;
    }
    case '\'':
    {
    new
    end = formatPos - 1,
    ch;
    while ((ch = format[++end]) && ch != '\'') {}
    if (!ch)
    {
    return -1;
    }
    format[end] = '\0';
    if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
    {
    if (format[end + 1])
    {
    return -1;
    }
    return 0;
    }
    format[end] = '\'';
    stringPos = ch + (end - formatPos);
    formatPos = end + 1;
    }
    case 'u':
    {
    new
    end = stringPos - 1,
    id = 0,
    bool:num = true,
    ch;
    while ((ch = string[++end]) && ch != delim)
    {
    if (num)
    {
    if ('0' <= ch <= '9')
    {
    id = (id * 10) + (ch - '0');
    }
    else
    {
    num = false;
    }
    }
    }
    if (num && IsPlayerConnected(id))
    {
    setarg(paramPos, 0, id);
    }
    else
    {
    #if !defined foreach
    #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
    #define __SSCANF_FOREACH__
    #endif
    string[end] = '\0';
    num = false;
    new
    name[MAX_PLAYER_NAME];
    id = end - stringPos;
    foreach (Player, playerid)
    {
    GetPlayerName(playerid, name, sizeof (name));
    if (!strcmp(name, string[stringPos], true, id))
    {
    setarg(paramPos, 0, playerid);
    num = true;
    break;
    }
    }
    if (!num)
    {
    setarg(paramPos, 0, INVALID_PLAYER_ID);
    }
    string[end] = ch;
    #if defined __SSCANF_FOREACH__
    #undef foreach
    #undef __SSCANF_FOREACH__
    #endif
    }
    stringPos = end;
    }
    case 's', 'z':
    {
    new
    i = 0,
    ch;
    if (format[formatPos])
    {
    while ((ch = string[stringPos++]) && ch != delim)
    {
    setarg(paramPos, i++, ch);
    }
    if (!i)
    {
    return -1;
    }
    }
    else
    {
    while ((ch = string[stringPos++]))
    {
    setarg(paramPos, i++, ch);
    }
    }
    stringPos--;
    setarg(paramPos, i, '\0');
    }
    default:
    {
    continue;
    }
    }
    while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
    {
    stringPos++;
    }
    while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
    {
    stringPos++;
    }
    paramPos++;
    }
    do
    {
    if ((delim = format[formatPos++]) > ' ')
    {
    if (delim == '\'')
    {
    while ((delim = format[formatPos++]) && delim != '\'') {}
    }
    else if (delim != 'z')
    {
    return delim;
    }
    }
    }
    while (delim > ' ');
    return 0;
    }



    Wenn ich nun aber compile bekomm ich einige Errors die sich alle in den sscanf Zeilen befinden:


    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2479) : error 001: expected token: "-identifier-", but found "-integer value-"
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2480) : warning 217: loose indentation
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2480) : error 017: undefined symbol "ch"
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2480) : warning 215: expression has no effect
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2481) : warning 217: loose indentation
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2483) : error 017: undefined symbol "ch"
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2483) : error 001: expected token: ";", but found "]"
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2483) : error 029: invalid expression, assumed zero
    C:\Users\PC\Desktop\Server_Self\gamemodes\DMD.pwn(2483) : fatal error 107: too many error messages on one line


    Ich hoffe das mir wer helfen kann ,


    Mit freundlichen Grüßen Nor