infinite.inc - unbegrenzte Arrays (D:)

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 ihr,


    im Teamspeak kam mir gerade eben nach einer Diskussion mit @BlackAce: die Idee nach einer Include, die es einem ermöglicht, unbegrenzt viele Arrays mit einer unbegrenzt großer Größe zu besitzen.
    Nach jahrelanger Entwicklung und Performierung veröffentliche ich sie nun für euch 8)


    Beispiele für Anwendungen sind diese:

    Zitat

    Man möchte gerne eine Anzahl an Autos laden, weiß aber nicht, wie viele es sind.
    Mit dieser Include kann man nach dem Spawnen die IDs speichern und diese z.B. für Fahrberechtigung nutzen, ohne ein überdimensioniertes Array zu nutzen und oder die Größe bei jedem neuen Auto zu ändern


    Funktionen sind aktuell folgende: ArrayPushString(array[], value[]) // Fügt dem Array "array[]" den String "value[]" zu
    ArrayPushInteger(array[], value) // Fügt dem Array "array[]" den Integer "value" zu
    ArrayPushFloat(array[], Float:value) // Fügt dem Array "array[]" den Float-Wert "value" zu


    ArrayPullString(array[], index, value[]) // Gibt den index-sten String von dem Array "array[]" zurück und speichert ihn in "value[]"
    ArrayPullInteger(array[], index) // Gibt den index-sten Integer von dem Array "array[]" zurück
    Float:ArrayPullFloat(array[], index) // Gibt den index-sten Float-Wert von dem Array "array[]" zurück


    // Die Update-Funktionen geben true/false zurück.
    // true bei Erfolg, false, wenn was schief ging (zB der Index noch nicht existiert, da das array noch nicht so groß ist)
    ArrayUpdateString(array[], index, value[]) // Setzt den index-sten Wer des Arrays "array[]"
    ArrayUpdateInteger(array[], index, value) // auch
    ArrayUpdateFloat(array[], index, Float:value) // auch


    ArrayLength(array[]) // Gibt die Länge des Arrays "array[]" zurück
    ArrayDeleteIndex(array[], index) // Löscht den Index "index" aus dem Array "array[]".


    Die Arrays verhalten sich etwas anders als normale Arrays.
    Diese handeln nach einem Stapelprinzip; wenn ein Element gelöscht wird, rücken die nächsten nach, damit es keine "leeren" Elemente gibt.


    Beispiele: public OnGameModeInit() {
    // Erstes Array befüllen
    ArrayPushInteger("sample", 1);
    ArrayPushInteger("sample", 2);
    ArrayPushInteger("sample", 3);
    ArrayPushInteger("sample", 4);
    // Zweites Array befüllen
    ArrayPushInteger("sample2", 5);
    ArrayPushInteger("sample2", 6);
    // Ausgeben, wie groß die sind
    printf("Länge 1: %d", ArrayLength("sample"));
    printf("Länge 2: %d", ArrayLength("sample2"));
    // Ein paar Testausgaben
    printf("Erster aus 1: %d", ArrayPullInteger("sample", 0));
    printf("Erster aus 2: %d", ArrayPullInteger("sample2", 0));
    // Etwas löschen
    ArrayDeleteIndex("sample", 0);
    ArrayDeleteIndex("sample", 0);
    // Ausgeben, was sich in 1 Verändert hat
    printf("Länge 1: %d", ArrayLength("sample"));
    printf("Erster aus 1: %d", ArrayPullInteger("sample", 0));
    }


    Changelog:

    Code
    0.1a
     - erster Release
    0.1b 
     - Filterscript-Kompatibel gemacht
    0.1c
     - Unterstützung von Floats
     - Ermöglicht das Verändern von Werten


    Version 0.1a
    Version 0.1b
    Version 0.1c


    PS: Die Include wurde von @BlackAce: für "sehr nützlich" eingestuft. Hoffe ich :whistling:

    Webdesign (bevorzugt backend) • Android-Development • node.js • Pawn • Linux
    Reverse Engineering • Social Engineering • Cryptoanalyse • PGP-Key
    Referenzen[color=#696969]Mein Facebook-Acc

    3 Mal editiert, zuletzt von Tion () aus folgendem Grund: Bug im Forum -> Pastebin, 0.1b, Edit vergessen, 0.1c

  • Ich glaube Y_LESS hat sowas schon mal veröffentlicht aber ohne Datenbank :D


    Und hier noch ein paar Kleinigkeiten:


    Zitat

    forward ArrayPushInteger(array[], value);


    Das zu folgendem Ändern:


    forward ArrayPushInteger(const array[], value);


    Und folgendes:


    Zitat

    new str[128];
    format(str, 128, "%d", value);


    Besser wäre:


    new str[32];
    valstr(str,value);


    Aber sonst, nette Idee ;)


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Ich glaube Y_LESS hat sowas schon mal veröffentlicht aber ohne Datenbank :D



    Jo das war y_malloc, die Idee gab es schon öfters in deiner Ausführung noch nicht , jedoch würde ich eher zum memory access plugin tendieren.


    was man bei dir jedoch nicht machen kann ist den inhalt einer "Zelle" zu bearbeiten, diesen müsste man momentan erstmal löschen und neu setzen,
    daher würde ich noch abfragen ob der Inhalt schon existiert falls ja einfach Updaten, wenn nicht neu eintragen. Das kannst du ja noch ergänzen

  • Ich glaube Y_LESS hat sowas schon mal veröffentlicht aber ohne Datenbank :D


    Jo das war y_malloc, die Idee gab es schon öfters in deiner Ausführung noch nicht , jedoch würde ich eher zum memory access plugin tendieren.

    Direktes hantieren in dem Arbeitsspeicher dürfte aber gerade Einsteiger etwas... schwerfallen. In dem Thread von y_malloc stehen ja etliche Fehler drinne, die man machen kann; und die einem auch den Server abschießen können.
    Dies hier ist eher eine "abgespeckte" Variante davon, um nicht direkt im RAM hantieren zu müssen, sondern eine sichere Lösung hat ;)


    was man bei dir jedoch nicht machen kann ist den inhalt einer "Zelle" zu bearbeiten, diesen müsste man momentan erstmal löschen und neu setzen,
    daher würde ich noch abfragen ob der Inhalt schon existiert falls ja einfach Updaten, wenn nicht neu eintragen. Das kannst du ja noch ergänzen

    Jup, man kann jetzt Zellen verändern, wenn diese existieren. Sonst geben die Update-Funktionen "false" zurück.
    Danke für die Anmerkung ;)

  • Jup, man kann jetzt Zellen verändern, wenn diese existieren. Sonst geben die Update-Funktionen "false" zurück.
    Danke für die Anmerkung ;)


    Kein Problem, du hast in der tat recht das man damit viel kaputt machen kann, daher empfehle ich das memory access plugin und dazu die Link list include von BigETI


    Plugin:
    http://gta-sa-mp.de/forum/3-sa…393-memory-access-plugin/


    Include:
    http://gta-sa-mp.de/forum/3-sa…397-linked-lists-in-pawn/


    Ebenso gibt es noch ein extra modus des Plugins , welche die sicherheit vor speicherlecks noch erhöht und die Performance ist auch besser als y_malloc.


    Du kannst dir das ganze ja mal anschauen auch mein Ingameeditor arbeitet mit dem plugin und bisher hatte ich damit noch keine Probleme.

  • Gute Idee und auch gute Umsetzung ! Hut ab :love:

    Dankeschön :love:


    IPrototypeI: Wenn du direkt als Anfänger so etwas brauchst, sind MA-Plugins trotzdem total verwirrend ^^
    Und das hier sollte recht simple sein ^^