Hab ein Problem bei Sscanf Optionale Parameter

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,
    undzwar möchte ich das man beim Befehl /Makeleader einen Fraktionsnamen oder eine FraktionsID eingibt.
    Das Problem ist wenn ich ingame: /makeleader 0 Arzt eingebe, printet er immer die 2.Variante

    new pID,fraktid,name[10];
    if(sscanf(params,"p< >uD(-1)S()[10]",pID,fraktid,name))return SCM(playerid,grau,"/makeleader [playerid/name] [fraktionsid/fraktname]");
    if(fraktid==-1)printf("1. Name:%s Fraktname:%s",SpielerName[pID],name);
    if(fraktid!=-1)printf("2. Name:%s FraktID:%d",SpielerName[pID],fraktid);
    Das wird geprintet:
    Name:test FraktID:0 //ingame eingabe: /makeleader 0 Arzt

  • Immer wieder sscanf, ... voller unerklärlicher Dinge.


    Mach's so:
    new pID,name[10];
    if(sscanf(params,"us[10]",pID,name))return SCM(playerid,grau,"/makeleader [playerid/name] [fraktionsid/fraktname]");
    if(!IsNumeric(name))printf("1. Name:%s Fraktname:%s",SpielerName[pID],name);
    else printf("2. Name:%s FraktID:%d",SpielerName[pID],strval(name));


    IsNumeric: http://forum.sa-mp.com/showpost.php?p=1345441&postcount=2

  • Jetzt wird das nicht geprintet es kommt immer wieder

    /makeleader [playerid/name] [fraktionsid/fraktname]

    Ich hab IsNumeric auch miteingefügt.
    Und so siehts bei mir aus:

    Spoiler anzeigen

    ocmd@2:makeleader,setleader(playerid,params[])
    {
    new pID,name[10];
    if(!IsPlayerAnAdmin(playerid,5))return SCM(playerid,grau,"Du bist kein Admin");
    if(sscanf(params,"us[10]",pID,name))return SCM(playerid,grau,"/makeleader [playerid/name] [fraktionsid/fraktname]");
    GetPlayerName(pID,SpielerName[pID],MAX_PLAYER_NAME);
    if(!IsNumeric(name))printf("1. Name:%s Fraktname:%s",SpielerName[pID],name);
    else printf("2. Name:%s FraktID:%d",SpielerName[pID],strval(name));
    if(!IsPlayerConnected(pID))return SCM(playerid,grau,"Der Spieler ist nicht on");
    if(!IsNumeric(name)) //hat einen Fraktionsnamen eingegeben
    {
    for(new i=0;i<10;i++)
    {
    if(strcmp(FraktionsEnum[i][Name],name,true))continue;
    format(Spieler[pID][FraktionsName],10,"%s",name);
    Spieler[pID][FraktionsID]=FraktionsEnum[i][ID];
    Spieler[pID][Fraktionsrang]=5;
    SCMEx(playerid,grün,"Du hast %s zum Leader der Fraktion %s(ID: %d) ernannt.",SpielerName[pID],name,FraktionsEnum[i][ID]);
    break;
    }
    }
    else {
    for(new i=0;i<10;i++)
    {
    if(FraktionsEnum[i][ID] == strval(name))continue;
    format(Spieler[pID][FraktionsName],20,"%s",FraktionsEnum[i][Name]);
    Spieler[pID][FraktionsID]=FraktionsEnum[i][ID];
    Spieler[pID][Fraktionsrang]=5;
    SCMEx(playerid,grün,"Du hast %s zum Leader der Fraktion %s(ID: %d) ernannt.",SpielerName[pID],FraktionsEnum[i][Name],FraktionsEnum[i][ID]);
    break;
    }
    }
    return 1;
    }

  • Ich weiß nicht warum sscanf hier wieder Probleme macht. Am besten du schmeißt es gradewegs in die Tonne, den Müll.


    Nimm strtok, macht nie Probleme.


    if(sscanf(params,"us[10]",pID,name))return SCM(playerid,grau,"/makeleader [playerid/name] [fraktionsid/fraktname]");


    erstzt du mit:
    new tmp[20], name[20], idx; tmp = strtok(params, idx); name = strtok(params, idx);
    if(!strlen(name)) return SCM(playerid,grau,"/makeleader [playerid/name] [fraktionsid/fraktname]");
    if(!IsNumeric(tmp)) pID = ReturnPlayerID(tmp);
    else pID = strval(tmp);


    Ist zwar mehr Code, dafür weiß man aber was der Code macht.



    strtok: http://wiki.sa-mp.com/wiki/Strtok
    ReturnPlayerID:
    stock ReturnPlayerID(PlayerName[])
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(!strcmp(pName(i),PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(strfind(pName(i),PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }

  • Ich weiß nicht warum sscanf hier wieder Probleme macht. Am besten du schmeißt es gradewegs in die Tonne, den Müll.


    sscanf muss nicht umbedingt stress schieben es kann auch sein das er einfach noch die funktion sscanf in seinem gamemode oder in einer anderen include hat.
    Normal müsste das oben funktionieren ohne probleme


    if(sscanf(params,"us[10]",pID,name))return SCM(playerid,grau,"/makeleader [playerid/name] [fraktionsid/fraktname]");

  • Hab noch eine Frage, dann brauch ich kein neuen Thread aufmachen.
    Undzwar

    //Meine eingabe ingame:
    /makeleader 0 Medic


    //das wird geprintet:
    Eingabe: Medic Gefunden: Zivilist(0)


    //Der Code:
    enum FraktionsEnumInfo{
    ID,
    Name[25]
    };
    new FraktionsEnum[][FraktionsEnumInfo]={
    {0,"Zivilist"},
    {1,"SAPD"},
    {2,"Medic"},
    {3,"Oamt"}
    };
    if(!IsNumeric(name)) //hat einen Fraktionsnamen eingegeben
    {
    for(new i=0;i<5;i++)
    {
    printf("%d",i);
    if(strcmp(FraktionsEnum[i][Name],name,true)==0)continue; //hier soll er überprüfen ob der eingegebene Fraktionsnamen existiert
    // aber es ist: "Zivilist"=="Medic" und er geht weiter
    print("weiter");//aber er nimmt einfach 0=Zivilist und geht weiter, obwohl Medic auf 2 ist
    format(Spieler[pID][FraktionsName],10,"%s",name);
    printf("Eingabe: %s Gefunden: %s(%d)",name,FraktionsEnum[i][Name],FraktionsEnum[i][ID]);
    Spieler[pID][FraktionsID]=FraktionsEnum[i][ID];
    Spieler[pID][Fraktionsrang]=5;
    SCMEx(playerid,grün,"Du hast %s zum Leader der Fraktion %s(ID: %d) ernannt.",SpielerName[pID],name,FraktionsEnum[i][ID]);
    break;
    }
    }

  • Hab noch eine Frage, dann brauch ich kein neuen Thread aufmachen.


    Mit sscanf hast du auch die möglichkeit deine eigenen specifer zu erstellen:



    SSCANF:fraktion(string[]) {
    new ret = strval(string);
    if (0 <= ret <= 3)return ret;
    for(new i; i != 4; ++i)if(strcmp(FraktionsEnum[i][Name],string,false)== 0)return FraktionsEnum[i][ID];
    return -1;
    }


    nutzung als specifer k<fraktion>