return "String" - Compilercrash

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
  • Hallöchen alle.
    Wie im Titel steht, bei folgender Funktion stürzt der Compiler bei mir ab :\ (hat geduaert, das Leck zu orten... )


    public killtorank(playerid,integer = 0) //kills stehen für gamepunkte
    {
    if(integer == 0)
    {
    if(ausbildung[playerid] == 0) return "Auszubildender";
    if(kills[playerid] >= 50) return "Soldat";
    if(kills[playerid] >= 100) return "Gefreiter";
    if(kills[playerid] >= 200) return "Unteroffizier";
    if(kills[playerid] >= 350) return "Feldwebel";
    if(kills[playerid] >= 550) return "Leutnant";
    if(kills[playerid] >= 800) return "Hauptmann";
    if(kills[playerid] >= 1000) return "Major";
    if(kills[playerid] >= 1300) return "Brigadegeneral";
    if(kills[playerid] >= 1500) return "Generalleutnant";
    if(kills[playerid] >= 2000) return "General";
    }
    else
    {
    if(ausbildung[playerid] == 0) return 0;
    if(kills[playerid] >= 50) return 1;
    if(kills[playerid] >= 100) return 2;
    if(kills[playerid] >= 200) return 3;
    if(kills[playerid] >= 350) return 4;
    if(kills[playerid] >= 550) return 5;
    if(kills[playerid] >= 800) return 6;
    if(kills[playerid] >= 1000) return 7;
    if(kills[playerid] >= 1300) return 8;
    if(kills[playerid] >= 1500) return 9;
    if(kills[playerid] >= 2000) return 10;
    }
    }


    Kann mir jemand kurz erläutern,
    was ich falsch gemacht habe, bzw. wie ich die Möglichkeit habe, einen String ODER Integer zurückgeben zu lassen ?


    mfg,
    Trooper

  • kann man nicht nur variablen (und zahlen) zurückgeben?
    Also statt "Oberst" Oberst


    /e.t.: Nein, kann man nicht.... :rolleyes:
    // wer auch immer geadded hat: ok danke. ich meinte eher ob man auch was mit "" zurückgeben kann ;)
    ///Du sagst ja bei killtorank integer = 0. also wie kann dann integer = 1 sein?

    Einmal editiert, zuletzt von Trooper[Y] ()

  • Geht auch noch kürzer, über eine eigentlich bescheuerte Art.
    Es lassen sich zwar keine Varchars mit return zurückgeben aber
    man kann während man es ausgibt den String formatieren.


    Würd dir außerdem raten deine if´s durch elseif zu ersetzen
    so wie es gerade da steht durchsucht er alle Funktionen selbst
    wenn der Spieler schon einen Rang ausgesucht hat...


    Code
    Prüfung Spieler = 10 Kills *geprüft
    Prüfung Spieler = 20 Kills *geprüft
    Prüfung Spieler = 30 Kills richtig (er prüft aber trotzdem weiter = unsinnig)
    Prüfung Spieler = 40 Kills *geprüft
    Prüfung Spieler = 50 Kills *geprüft
    Prüfung Spieler = 60 Kills *geprüft


    Hoffentlich ist das jetzt besser zu erkennen
    Du brauchst dazu nur die Kills von groß nach Klein sotieren



    new var[20];
    public killtorank(playerid,integer = 0) //kills stehen für gamepunkte
    {
    if(integer == 0)
    {
    if(ausbildung[playerid] >= 2000) return var="Auszubildender";
    else if(kills[playerid] >= 1500) return var="Soldat";
    else if(kills[playerid] >= 1300) return var="Gefreiter";
    else if(kills[playerid] >= 1000) return var="Unteroffizier";
    else if(kills[playerid] >= 800) return var="Feldwebel";
    else if(kills[playerid] >= 550) return var="Leutnant";
    else if(kills[playerid] >= 350) return var="Hauptmann";
    else if(kills[playerid] >= 200) return var="Major";
    else if(kills[playerid] >= 100) return var="Brigadegeneral";
    else if(kills[playerid] >= 50) return var="Generalleutnant";
    else if(kills[playerid] >= 0) return var="General";
    }
    else
    {
    /*Hier auch um umdrehen Server Cpu zu schonen*/
    if(ausbildung[playerid] == 0) return 0;
    else if(kills[playerid] >= 50) return 1;
    else if(kills[playerid] >= 100) return 2;
    else if(kills[playerid] >= 200) return 3;
    else if(kills[playerid] >= 350) return 4;
    else if(kills[playerid] >= 550) return 5;
    else if(kills[playerid] >= 800) return 6;
    else if(kills[playerid] >= 1000) return 7;
    else if(kills[playerid] >= 1300) return 8;
    else if(kills[playerid] >= 1500) return 9;
    else if(kills[playerid] >= 2000) return 10;
    }
    }

    [align=center]
    Mta Script Editor - Work in Progress

  • Ich probiers morgen mal.


    Zitat

    Würd dir außerdem raten deine if´s durch elseif zu ersetzen
    so wie es gerade da steht durchsucht er alle Funktionen selbst
    wenn der Spieler schon einen Rang ausgesucht hat...


    Stimmt nicht, return bricht die Aktion ab, wenn er einen Rang schon hat ;)

  • public kann nur bool returnen.


    So ausgedrückt falsch.


    Public-Funktionen können OHNE Taggen NUR Integer zurück geben. Durch das Taggen kann man auch Booleans und Float-Werte returnen lassen.


    Bsp (Pseudo-Code):
    forward Float:retFloat(Float:val_1, Float:def = 1.0);
    public Float:retFloat(Float:val_1, Float:def = 1.0)
    {
    while((val_1 += def) != 10.0) print("%.2f", val_1);
    return val_1;
    }


    // Bzw:
    forward bool:isDone(thing);
    public bool:isDone(thing)
    {
    switch(state[thing]) {
    case 0: return false;
    case 1: return true;
    }
    return false;
    }