Temporäre Variablen in Stock übernehmen

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
  • Tach,
    bin mir nicht sicher ob der Titel zu diesen Problem passt, falls nicht, tuts mir leid.


    Mein Problem ist Folgdendes:


    Ich hab mir heute 2 stockfunctionen von TCL in Pawn übersetzt, nun weiß ich jedoch nicht ob Pawn Variablen in Stock funktionen übernehmen kann ohne diese direkt in das Stock einzuarbeiten.
    Dies ist in TCL mit upvar möglich Variablen ohne direkte angabe zu übernehmen.


    Hier der Code:

    Spoiler anzeigen
    stock sectostr ( t, args=0 )
    {
    new EndText[128];

    Spoiler anzeigen
    if(args == 1)
    {
    sectostr_one (31536000, "Jahr", "Jahre", "ein");
    sectostr_one (604800, "Woche", "Wochen", "eine");
    sectostr_one (86400, "Tag", "Tage", "einen");
    sectostr_one (3600, "Stunde", "Stunden", "eine");
    sectostr_one (60, "Minute", "Minuten", "eine");
    sectostr_one (1, "Sekunde", "Sekunden", "eine");
    } else {
    sectostr_one (31536000, "Jahr", "Jahre", "einem");
    sectostr_one (604800, "Woche", "Wochen", "einer");
    sectostr_one (86400, "Tag", "Tage", "einen");
    sectostr_one (3600, "Stunde", "Stunden", "einer");
    sectostr_one (60, "Minute", "Minuten", "einer");
    sectostr_one (1, "Sekunde", "Sekunden", "einer");
    }

    Spoiler anzeigen
    if(strlen(EndText) == 0)
    {
    format (EndText, sizeof(EndText), "0 Sekunden");
    }
    return EndText;
    }

    Spoiler anzeigen
    stock sectostr_one (x, cap[], cappl[], capone[])
    {
    new Float:num;
    if(t >= x)
    {
    num = floatround(time/x, floatround_ceil);
    num = floatround(num);
    t = t%x;
    if(strlen(EndText) == 0)
    {
    if (t > 0) format(EndText,sizeof(EndText), "%s, ", EndText);
    else format(EndText,sizeof(EndText), "%s und ", EndText);
    }
    if(floatint(num) > 1) format(EndText,sizeof(EndText), "%s %i %s", EndText, floatint(num), cappl);
    else format(EndText,sizeof(EndText), "%s %s %s", EndText, capone, cappl);
    }
    }


    Dazu die wie zu erwartenden Fehlermeldungen:

    Code
    C:\*Neu.pwn(1073) : warning 203: symbol is never used: "t"C:\*Neu.pwn(1073 -- 1104) : error 017: undefined symbol "t"C:\*Neu.pwn(1106) : error 017: undefined symbol "time"C:\*Neu.pwn(1108) : error 017: undefined symbol "t"C:\*Neu.pwn(1108) : error 017: undefined symbol "t"C:\*Neu.pwn(1108) : warning 215: expression has no effectC:\*Neu.pwn(1109) : error 017: undefined symbol "EndText"C:\*Neu.pwn(1111) : error 017: undefined symbol "t"C:\*Neu.pwn(1111) : error 017: undefined symbol "EndText"C:\*Neu.pwn(1111) : error 017: undefined symbol "EndText"C:\*Neu.pwn(1111) : fatal error 107: too many error messages on one line


    Ist dies in Pawn garnicht möglich oder muss dies wie in TCL mit einen Befehl aufgerufen werden?


    Liebe Grüße,
    Akuba

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • Sieht in PAWN so aus:


    stock sectostr ( t, args=0 )
    {
    new EndText[128];


    if(args == 1)
    {
    EndText = sectostr_one (31536000, "Jahr", "Jahre", "ein", t);
    EndText = sectostr_one (604800, "Woche", "Wochen", "eine", t);
    EndText = sectostr_one (86400, "Tag", "Tage", "einen", t);
    EndText = sectostr_one (3600, "Stunde", "Stunden", "eine", t);
    EndText = sectostr_one (60, "Minute", "Minuten", "eine", t);
    EndText = sectostr_one (1, "Sekunde", "Sekunden", "eine", t);
    } else {
    EndText = sectostr_one (31536000, "Jahr", "Jahre", "einem", t);
    EndText = sectostr_one (604800, "Woche", "Wochen", "einer", t);
    EndText = sectostr_one (86400, "Tag", "Tage", "einen", t);
    EndText = sectostr_one (3600, "Stunde", "Stunden", "einer", t);
    EndText = sectostr_one (60, "Minute", "Minuten", "einer", t);
    EndText = sectostr_one (1, "Sekunde", "Sekunden", "einer", t);
    }


    if(strlen(EndText) == 0)
    {
    format (EndText, sizeof(EndText), "0 Sekunden");
    }
    return EndText;
    }


    stock sectostr_one (x, cap[], cappl[], capone[], t)
    {
    new Float:num, EndText[128];
    if(t >= x)
    {
    num = floatround(time/x, floatround_ceil);
    num = floatround(num);
    t = t%x;
    if(strlen(EndText) == 0)
    {
    if (t > 0) format(EndText,sizeof(EndText), "%s, ", EndText);
    else format(EndText,sizeof(EndText), "%s und ", EndText);
    }
    if(floatint(num) > 1) format(EndText,sizeof(EndText), "%s %i %s", EndText, floatint(num), cappl);
    else format(EndText,sizeof(EndText), "%s %s %s", EndText, capone, cappl);
    }
    return EndText;
    }



    Ich glaube eine Erklärung brauchst du nicht, ein Anfänger scheinst du ja nicht zu sein also wirst du das verstehen, da bin ich mir sicher.

  • Erstmal danke für das Beispiel, allerdings hab ich bis jetzt 2 Probleme gehabt:


    1. Das EndText immer überschrieben wurde, hab ich behoben.
    2. bleibt die Variable "t" unberüht im ersten Stock, vorgesehen war das diese direkt von sectostr_one mit bearbeitet wird. nun lässt sich in Pawn ja nur eine Variable returne, wie lös ich das ganze jetzt am besten?


    Derzeit kommt folgendes dabei raus:


    bei 300 Sekunden sollte eigendlich 5 Minuten Rauskommen.


    Spoiler anzeigen

    // in OnPlayerCommandText:
    if(strcmp(cmd, "/sectostr", true) == 0)
    {
    new tmp[128];
    tmp = strtok(cmdtext, idx);
    if(strlen(tmp)==0) return SendClientMessage(playerid, 0xFF0000FF, "FEHLER: {FFFFFF}/sectostr [Sekunden]");
    else return SendClientMessage(playerid, COLOR_GREEN, sectostr(strval(tmp), 1));
    }

    Spoiler anzeigen
    // Die überarbeiteten Stock funktionen:
    stock sectostr ( t, args=0 )
    {
    new EndText[128] = "\0";
    if(args == 1)
    {
    EndText = sectostr_one (31536000, "Jahr", "Jahre", "ein", t, EndText);
    EndText = sectostr_one (604800, "Woche", "Wochen", "eine", t, EndText);
    EndText = sectostr_one (86400, "Tag", "Tage", "einen", t, EndText);
    EndText = sectostr_one (3600, "Stunde", "Stunden", "eine", t, EndText);
    EndText = sectostr_one (60, "Minute", "Minuten", "eine", t, EndText);
    EndText = sectostr_one (1, "Sekunde", "Sekunden", "eine", t, EndText);
    } else {
    EndText = sectostr_one (31536000, "Jahr", "Jahre", "einem", t, EndText);
    EndText = sectostr_one (604800, "Woche", "Wochen", "einer", t, EndText);
    EndText = sectostr_one (86400, "Tag", "Tage", "einen", t, EndText);
    EndText = sectostr_one (3600, "Stunde", "Stunden", "einer", t, EndText);
    EndText = sectostr_one (60, "Minute", "Minuten", "einer", t, EndText);
    EndText = sectostr_one (1, "Sekunde", "Sekunden", "einer", t, EndText);
    }

    Spoiler anzeigen
    if(strlen(EndText) == 0)
    {
    format (EndText, sizeof(EndText), "0 Sekunden");
    }
    return EndText;
    }

    Spoiler anzeigen
    stock sectostr_one (x, cap[], cappl[], capone[], t, EndText[128])
    {
    new Float:num;
    if(t >= x)
    {
    num = floatround(t/x, floatround_ceil);
    num = floatround(num);
    t = t%x;
    if(strlen(EndText) == 0)
    {
    if (t > 0) format(EndText,sizeof(EndText), "%s, ", EndText);
    else format(EndText,sizeof(EndText), "%s und ", EndText);
    }
    if(num > 1) format(EndText,sizeof(EndText), "%s %i %s", EndText, num, cappl);
    else format(EndText,sizeof(EndText), "%s %s %s", EndText, capone, cap);
    }
    return EndText;
    }

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • Das war es, danke :D


    mir viel eben noch ein Fehler von mir auf: ich hab den gleitkommawert in einen Integer umgewandelt und wieder in eine Float variable gesteckt, das erklärt die eigenartigen Zahlen.


    Nun Funktioniert alles wie es soll, Danke :D

    Ich helfe gerne, aber nur wenn die andere Person wenigstens versucht es zu schaffen.
    Solange sie nicht so dreist sind und mich beim Zocken zuspammen.

  • Es waren paar kleine Fehler im Code.


    stock sectostr ( t, args=0 )
    {
    new EndText[128] = "\0";
    if(args == 1)
    {
    t = sectostr_one (31536000, "Jahr", "Jahre", "ein", t, EndText);
    t = sectostr_one (604800, "Woche", "Wochen", "eine", t, EndText);
    t = sectostr_one (86400, "Tag", "Tage", "einen", t, EndText);
    t = sectostr_one (3600, "Stunde", "Stunden", "eine", t, EndText);
    t = sectostr_one (60, "Minute", "Minuten", "eine", t, EndText);
    t = sectostr_one (1, "Sekunde", "Sekunden", "eine", t, EndText);
    } else {
    t = sectostr_one (31536000, "Jahr", "Jahre", "einem", t, EndText);
    t = sectostr_one (604800, "Woche", "Wochen", "einer", t, EndText);
    t = sectostr_one (86400, "Tag", "Tage", "einen", t, EndText);
    t = sectostr_one (3600, "Stunde", "Stunden", "einer", t, EndText);
    t = sectostr_one (60, "Minute", "Minuten", "einer", t, EndText);
    t = sectostr_one (1, "Sekunde", "Sekunden", "einer", t, EndText);
    }


    if(strlen(EndText) == 0)
    {
    format (EndText, sizeof(EndText), "0 Sekunden");
    }
    return EndText;
    }


    stock sectostr_one (x, cap[], cappl[], capone[], t, EndText[128])
    {
    new num;
    if(t >= x)
    {
    num = t / x; //Hier das mit float und so war falsch, so ist es besser.
    t = t%x;
    if(strlen(EndText) != 0) //Hier stand == 0, war nicht richtig.
    {
    if (t > 0) format(EndText,sizeof(EndText), "%s, ", EndText);
    else format(EndText,sizeof(EndText), "%s und ", EndText);
    }
    if(num > 1) format(EndText,sizeof(EndText), "%s%i %s", EndText, num, cappl);
    else format(EndText,sizeof(EndText), "%s%s %s", EndText, capone, cap); //Die Lücken waren falsch gesetzt.
    }
    return t;
    }


    Test-Ausgabe:


    Respekt für die Idee, habe ich so noch nicht gesehen, finds aber gut. Gute Sache. :thumbup:


    EDIT: Da warst 1ms schneller als ich. Aber schau dir trotzdem meinen Code noch an, das mit den Rundungen kannst du dir sparen. Außerdem ist der Rückgabewert nur ein Integer und kein String.