strcmp spuckt error aus

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
  • Hi,
    ich möchte 2 Strings mit strcmp Vergleichen doch es kommt dieser Error:

    Code
    error 008: must be a constant expression; assumed zero


    Die betreffenden Zeilen sind diese:

    new password[] = dini_Get("/Accounts/%s.ini", "Passwort");
    if(!strcmp(inputtext, password, false, strlen(password)))
    {

    Kann mir da jemand helfen?

  • Schreib das mal so:


    new string[64];
    GetPlayerName(playerid,string,MAX_PLAYER_NAME);
    format(string,sizeof string,"/Accounts/%s.ini",string);
    format(string,sizeof string, dini_Get(string, "Passwort"));
    if(!strcmp(inputtext, string))
    {
    //Hier ist das pw richtig
    }
    else
    {
    //Hier falsch!
    }


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Vielen Vielen dank der Error is schonmal weg. Ich habe mein Login/Register Sytsem nun fertig und wenn ich mit einem Account joine der nicht eingetragen ist kommt auch das register Fenster doch sobald ich dort weiter drücke spawne ich in LV wie wenn man unter auf Spawn drücken würde ...
    Hier ist einmal meine OnDialogResponse:

    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);

    //Login/Register System
    if(response)// They pressed the first button.
    {
    switch(dialogid)// If you only have one dialog, then this isn't required, but it's neater for when you implement more dialogs.
    {
    case 1:// LOGIN FENSTER
    {
    if(strlen(inputtext) > 0)
    {
    new string[64];
    GetPlayerName(playerid,string,MAX_PLAYER_NAME);
    format(string,sizeof string,"/Accounts/%s.ini",string);
    format(string,sizeof string, dini_Get(string, "Passwort"));
    if(!strcmp(inputtext, string))
    {
    //Geld setzen
    new string1[64];
    GetPlayerName(playerid,string1,MAX_PLAYER_NAME);
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid, dini_Int("/Accounts/%s.ini", "Geld"));
    //Scroe setzen
    new string2[64];
    GetPlayerName(playerid,string2,MAX_PLAYER_NAME);
    SetPlayerScore(playerid, dini_Int("/Accounts/%s.ini", "Level"));
    //Narchicht und spawn
    SetSpawnInfo(playerid, 0, 26, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    SendClientMessage(playerid, COLOR_YELLOW, "Willkommen auf 'Empire Bay Reallife'");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Falsches Passwort");
    Kick(playerid);
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Das Passwort ist zu kurz!");
    }
    }
    case 2:// REGISTER FENSTER
    {
    if(strlen(inputtext) > 3)
    {
    new string[64];
    GetPlayerName(playerid, string, MAX_PLAYER_NAME);
    dini_Create("/Accounts/%s.ini");
    //Sachen eintragen: (Key=Value)
    dini_Set("/Accounts/%s.ini", "Passwort", inputtext);
    dini_IntSet("/Accounts/%s.ini", "Geld", 5000);
    dini_IntSet("/Accounts/%s.ini", "Level", 1);

    SendClientMessage(playerid, COLOR_GREEN, "Dein Account wurde erfolgreich eingerichtet.\nMache bitte einen relog!");
    Kick(playerid);
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Das Passwort muss mindestens 4 Zeichen lang sein!");
    Kick(playerid);
    }
    }
    }
    }
    else
    {
    Kick(playerid);
    }
    return 1;
    }


    Weisst du da auch noch eine Lösung?


    //EDIT: Habe bemerkt hatte falsche IDs beim erstellen der Dialoge. Hab die angepasst werde jetzt aber direkt gekickt wenn ich beim register mein pw eingeben und bekommne keine Narchicht


    //EDIT2: Anscheinend werden mir alle SendClientMessage nicht angezeigt und die TextDatei in Account heisst nicht wie der Spielername sondern %s (öhm lol). So wie es aussieht scheint man sich auch mit jedem Passwort einloggen zu können und nicht mit dem was in der Datei steht ... (Kann es sein dass das ganze Ding nich geht? ...)

    2 Mal editiert, zuletzt von ciaxx ()

  • Das liegt daran, dass du den Pfad nicht formatiert hast, somit wird der Platzhalter nicht ersetzt und der Pfad stimmt nicht.
    Die Nachrichten bekommst du nicht, da alles was mit Kick/Ban(playerid) ausgeführt wird nicht mehr angezeigt wird. Nutze entweder die Kick/Ban-Fix Include oder mache es mit einem kurzen Timer wie im Code unten:


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    //Login/Register System
    if(response)// They pressed the first button.
    {
    switch(dialogid)// If you only have one dialog, then this isn't required, but it's neater for when you implement more dialogs.
    {
    case 1:// LOGIN FENSTER
    {
    if(strlen(inputtext) > 3)
    {
    new string[64];
    GetPlayerName(playerid,string,MAX_PLAYER_NAME);
    format(string,sizeof string,"/Accounts/%s.ini",string);
    if(!strcmp(inputtext, dini_Get(string, "Passwort")))
    {
    //Geld setzen
    ResetPlayerMoney(playerid);
    GivePlayerMoney(playerid, dini_Int(string, "Geld"));
    //Scroe setzen
    SetPlayerScore(playerid, dini_Int(string, "Level"));
    //Narchicht und spawn
    SetSpawnInfo(playerid, 0, 26, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
    SpawnPlayer(playerid);
    SendClientMessage(playerid, COLOR_YELLOW, "Willkommen auf 'Empire Bay Reallife'");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Falsches Passwort");
    SetTimerEx("KickPlayer", 250, 0, "d", playerid);
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Das Passwort ist zu kurz!");
    }
    }
    case 2:// REGISTER FENSTER
    {
    if(strlen(inputtext) > 3)
    {
    new string[64];
    GetPlayerName(playerid, string, MAX_PLAYER_NAME);
    format(string, sizeof(string), "/Accounts/%s.ini", string);
    dini_Create(string);
    //Sachen eintragen: (Key=Value)
    dini_Set(string, "Passwort", inputtext);
    dini_IntSet(string, "Geld", 5000);
    dini_IntSet(string, "Level", 1);
    SendClientMessage(playerid, COLOR_GREEN, "Dein Account wurde erfolgreich eingerichtet.\nMache bitte einen relog!");
    SetTimerEx("KickPlayer", 250, 0, "d", playerid);
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Das Passwort muss mindestens 4 Zeichen lang sein!");
    SetTimerEx("KickPlayer", 250, 0, "d", playerid);
    }
    }
    }
    }
    else
    {
    Kick(playerid);
    }
    return 1;
    }


    forward KickPlayer(playerid);
    public KickPlayer(playerid)
    {
    return Kick(playerid);
    }

  • Vielen vielen Dank es funktioniert :D Ich musste beim prüfen ob der Spieler existiert auch noch den Platzhalter ersetzten aber das habe ich alleine hinbekommen (irgendwei das einzige was direkt funktioniert ... ;( ). Eine Frage hätte ich noch: Wie zeigt man dem Player diese schwarzen ränder oben und unten im Bildschirm an für ein Tutorial? Wollte mal im Wiki gucken habe aber keine Ahnung wie sowas heisst und Google gibt auch nichts aus ...