Nützliche Codeschnipsel

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
  • Wenn man es über eine DB usw macht dauert es schon etwas länger


    Wie lang dauert es für dich bitte eine Integer Variable zu deinem speichersystem hinzuzufügen?!


    Ich denke maximal 30 Sekunden... :)

    ast2ufdyxkb1.png


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

  • Wie lang dauert es für dich bitte eine Integer Variable zu deinem speichersystem hinzuzufügen?!


    Er meint wohl den kompletten aufbau.


    Mit 5 Minuten kommt man da wohl nicht aus.
    Datenbank anlegen, Tabellen anlegen, Speicherung schreiben, Laden schreiben.
    Halbe bis dreiviertel Stunde würde ich da schätzen.


    Je nachdem wie "umfangreich" und intelligent das System an sich nachher ist, vielleicht auch eine ganze Stunde.
    Hinzufügen von Dingen - davon will jetzt jetzt nicht anfangen - das ist wirklich lächerlich ;D

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Das Arbeiten mit Bits ist bei heutigen Prozessoren meist unnötig und nur eine komplizierte Schreibweise, die zudem meistens langsamer ist. Ich würde das so nicht empfehlen, wenn jemand wirklich auf die Laufzeitperformance achtet.


    Sondern:
    new bool:Hut[MAX_PLAYERS];
    new bool:Shirt[MAX_PLAYERS];
    new bool:Tasche[MAX_PLAYERS];
    new bool:Fahrrad[MAX_PLAYERS];


    #define GivePlayerItem(%0,%1) %1[%0] = true
    #define RemovePlayerItem(%0,%1) %1[%0] = false
    #define HasItem(%0,%1) %1[%0]
    #define ResetAllItems(%0) Hut[%0] = Shirt[%0] = Tasche[%0] = Fahrrad[%0] = false


    GivePlayerItem(playerid,Hut);


    Mal vom ResetAllItems abgesehen, das ist nicht sooo schön.
    Das egalisiert sich aber durch den Performancegewinn am Rest, denn die Bit-Methode ist knappe 25% langsamer beim schreiben, und 15% beim Lesen und die Tatsache, dass man kein 32er Limit an Items hat.


    Und nebenbei, einfacher zu verstehen ist es auch :klugs:

  • wenn jemand wirklich auf die Laufzeitperformance achtet.


    Ich sag mal so, bei 10.000 Durchläufen brauchen beide 1ms für das setzen...da ist kein Unterschied...erst ab über 1.000.000 Durchläufen wird da was ersichtlich, aber bitte...wer hat Schleifen im Skript für mehr als 10.000 Durchläufe...


    und nur eine komplizierte Schreibweise


    Man hat 1x die Makros...dann ist es einfach nur noch hinzufügen, denke so komplex ist das nicht.


    Der Vorteil an der Methode ist einfach, dass man keine 32 Variablen mit einem Array von jeweils MAX_PLAYERS erstellen muss!


    Somit hält das halt die amx schön klein und wie gesagt, den Laufzeit unterschied wirst du niemals auch nur ansatzweise inGame merken :rolleyes:

    ast2ufdyxkb1.png


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

  • wer hat Schleifen im Skript für mehr als 10.000 Durchläufe


    Wobei das ja nichts an der Tatsache ändert, dass die Laufzeitperformance besser ist. Dass sie - im kleinen Bereich - unwesentlich ist, ist mir klar. Besser ist sie trotzdem.


    Man hat 1x die Makros...dann ist es einfach nur noch hinzufügen


    Natürlich. Das ändert aber auch nichts daran, dass die Schreibweise von Bit-Berechnungen komplizierter ist. Du argumentierst am Thema vorbei.


    Somit hält das halt die amx schön klein


    400 Bytes Unterschied, mein MAX_PLAYERS steht auf 150. Das ist ebenso unwesentlich wie die eingesparte Laufzeit, nur habe ich persönlich lieber eine größere AMX als Lags.
    Aber das wird doch lächerlich. Weder 1MB Festplattenplatz noch 1ms Laufzeit stören jemand - in SA-MP zumindest.


    Allerdings will mit Sicherheit jemand mal mehr als 32 Items haben, und dann ist er froh drum.

  • Nun gibt es auch IsString und IsFloat + IsOnlyString, IsOnlyFloat und IsOnlyNumber.
    Auch wenn es IsNumeric schon gibt, hab ich es kurz selber geschrieben



    Hier nochmal ein Screen von der reihenfolge.

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • Keine der Funktionen funktioniert so wie sie soll.
    printf("%d",IsString("Hallo1")); //true -> (Hat aber eine Zahl, muss false sein)
    printf("%d",IsFloat("0.a")); //true -> (Hat einen Buchstabe, muss false sein)
    printf("%d",IsFloat("0..1")); //true -> (Hat zwei Punkte, muss false sein)
    printf("%d",IsNumber("Hallo0a")); //true -> (Das ist keine Zahl, sollte klar sein dass das false ist)
    printf("%d",IsOnlyString("eeeee")); //false -> (Das ist ein String, muss true sein)
    printf("%d",IsOnlyFloat("9.9")); //false -> (9.9 ist sehr wohl ein Float, muss true sein)
    printf("%d",IsOnlyNumber("123456789")); //false -> (Das ist eine Zahl, muss true sein)


    Das solltest du überarbeiten.

  • Die Funktionen sind kaum bis gar nicht einsatzbereit.
    Ergänzend zu dem von Jeffry:
    - Bei Floats möchtest du sicherlich nur einen Punkt (.) erlauben und nicht 20.
    - Zahlen können ein Vorzeichen haben (+ oder -)
    - Texte (Strings) decken nur deutsche Buchstaben ab und da nicht mal alle (ß, Satzzeichen, etc).
    Um jetzt nur mal die gängigsten Fälle abzudecken.



    Zumindest hast du dir Tests geschrieben um die Funktionen zu prüfen. Das sind aber zu wenig Testfälle um die gängisten Szenarien abzudecken. Bischen kreativer muss man da schon bei seinen Tests sein.

  • Ich war so frei und habe die Funktionen verbessert.
    Die IsOnly... Funktionen habe ich weg gelassen, da diese hier keinen Sinn mehr geben, da sie das gleiche darstellen würden.


    stock IsLetterString(str[]) //©Jeffry
    {
    if(!strlen(str)) return 0;
    for(new i = 0, j = strlen(str); i < j; i++)
    {
    switch(str[i])
    {
    case 'A'..'Z', 'a'..'z': continue;
    case 138, 142, 159, 192..214, 216..246, 248..255: continue;
    }
    return 0;
    }
    return 1;
    }


    stock IsNumber(str[]) //©Jeffry
    {
    if(!strlen(str)) return 0;
    for(new i = 0, j = strlen(str); i < j; i++)
    {
    switch(str[i])
    {
    case '0'..'9': continue;
    case '+', '-': if(i == 0) continue;
    }
    return 0;
    }
    return 1;
    }


    stock IsFloat(str[]) //©Jeffry
    {
    if(!strlen(str)) return 0;
    new l_dct;
    for (new i = 0, j = strlen(str); i < j; i++)
    {
    switch(str[i])
    {
    case '0'..'9': continue;
    case '+', '-': if(i == 0 && i != j-1) continue;
    case '.':
    {
    l_dct++;
    if(l_dct == 1 && i != 0 && i != j-1 && str[i-1] != '+' && str[i-1] != '-') continue;
    }
    }
    return 0;
    }
    return 1;
    }



    Verwendung:
    printf("%d",IsLetterString("Jeffry")); //true
    printf("%d",IsLetterString("Hallo123!")); //false
    printf("%d",IsNumber("+14032401")); //true
    printf("%d",IsNumber("14032401")); //true
    printf("%d",IsNumber("Jeffry")); //false
    printf("%d",IsFloat("14.03")); //true
    printf("%d",IsFloat("-24.01")); //true
    printf("%d",IsFloat("9.9a")); //false

  • Jeffry wieso keine natives nutzen , welche ziemlich schnell sind



    #define IsNumber(%0) (strval(%0) ? true : false)
    #define IsFloat(%0) (floatstr(%0) ? true : false)



    Doppelt gemobbelt hält zwar besser :D , aber da wir Performance Junkies sind


    stock IsLetterString(const str[])
    {
    new i = 0, j = strlen(str);
    if(!j) return 0;
    for(; i < j; i++) if(48 <= str[i] <= 57) return 0;
    return 1;
    }


  • Aber Trotzdem Danke Jeffty, dass du es mit anderen Fehlern mal getestet hast.

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • Beitrag von H4rd_B4se ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Man könnte damit abfragen, ob ein korrekter Name eingegeben wurde, der beinhaltet ja keine Zahlen.


    dann dürfte aber zb. 123marvin123 seinem Namen in kein Dialog schreiben, wenn der input mit IsLetterString geprüft wird.
    Außerdem hatte ich für die Nur String,Float,Number die Only Funktionen geschrieben.

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • Das wäre dann auch kein wirklicher Name, sondern ein Nickname.


    Das spielt ja auch keine Rolle, IsLetterString fragt ab ob der String nur aus validen Buchstaben besteht. Wofür man das letztendlich verwendet kann sehr unterschiedlich sein. Beispiele sind wie gesagt Namen, Stadtnamen, irgendwelche Essen, etc...


    Eine Abfrage IsString würde keinen Sinn machen, da ein String nach seiner Definition jedes Zeichen beinhalten kann, das als Text dargestellt werden kann.