Problem mit SSCANF

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
  • Wie im Titel oben schon beschrieben, habe ich ein Problem mit SSCANF.
    Ich habe diesen Befehl hier:
    ocmd:spawn(playerid,params[])
    {
    if(!isAdmin(playerid,1))return SendClientMessage(playerid,Rot,Aerror);
    new pID, string[128], alevel[128];
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,Gelb,"Verwendung: /spawn [Playerid]");
    if(!IsPlayerConnected(pID))return SendClientMessage(playerid,Rot,Oerror);
    switch(GetPVarInt(playerid,"Adminlevel"))
    {
    case 1:{alevel="Supporter";}
    case 2:{alevel="Moderator";}
    case 3:{alevel="Administrator";}
    case 4:{alevel="Super Admin";}
    case 5:{alevel="Manager";}
    case 6:{alevel="Leiter";}
    }
    format(string,128,"%s %s hat den Spieler %s gespawnt.",alevel,GetName(playerid),GetName(pID));
    SendClientMessageToAll(Rot,string);
    SpawnPlayer(pID);
    return 1;
    }

    Und den SScanf code:
    stock sscanf(string[],format[],{Float,_}:...){if(string[0]==0||(string[0]==1&&string[1]==0)){return format[0];}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__
    #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 compilen will kommt das:
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(687) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(687) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(687) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(688) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(688) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(689) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(689) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(690) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(690) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(690) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(695) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(695) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(698) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(698) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(698) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(698) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(698) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(698) : warning 217: loose indentation
    C:\Users\Smith Fmily\Desktop\0.3eR2 - MySQL\gamemodes\WOGD.pwn(699) : warning 217: loose indentation
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    19 Warnings.



    Warum? Info: Aerror und Oerror sind Texte, die ich oben definiert habe. Wenn ich sie rausnehme, kommt immer noch das selbe.

  • bedeutet falsch eingerückt.
    hier mal richtig:


    Spoiler anzeigen


    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':
    {

    Spoiler anzeigen
    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;
    }

    b_560_95_1.png[/url]



    b_560_95_1.png[/url]

  • Meiner nicht, das ist der originale vom SA:MP Wiki, benutze ggf. das Plugin.

  • warscheinlich kontest du den code benutzen weil du sscanf bis dato noch nicht benutzt hast stocks werden bei keiner benutzung vom kompiler ignoriert

    Mfg aXD


    Kurze und Produktive antworten (manchmal) mit vielen Rechtschreibfehlern ;D

  • schreib einfach oben in dein Script direkt unter die Includes das hier:


    #pragma tabsize 0


    Dann sollten alle Warnings verschwinden !


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S