Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 5 von 5
  1. Beiträge anzeigen #1 Zitieren
    Lehrling Avatar von dataframe
    Registriert seit
    Mar 2021
    Beiträge
    25
     
    dataframe ist offline

    Dynamischer Zugriff auf Element in Datenstruktur

    Hallo zusammen,

    was ist der gänige Weg um dynamische Datenstrukturen in Daedalus zu nutzen? Ich habe ursprünglich versucht ein Array-Element mittels Variable zu beziehen - laut der Dokumentation funktioniert dieses Vorgehen, wie man es aus allen möglichen Sprachen kennt, leider nicht (https://www.worldofgothic.de/modifik...go=daedalus#06) - ich habe mir daraufhin die üblichen verdächtigen (z.B. LeGo) angesehen, werde aber nicht so recht mit der Syntax warm - hat jemand Erfahrung im Umgang damit?

    Was ich vorhabe: ich möchte mittels index ein Element aus einem Array (oder sonst einer Datenstruktur) auslesen und verwenden.

    Ich bin dabei über die folgende Dokumentation gestolpert: https://lego.worldofplayers.de/?List - frage mich allerdings wie ich solch eine Liste mit üblichen Strings 1.) initialisieren, 2.) befüllen und 3.) auslesen kann.

    Erneut vielen Dank!

  2. Beiträge anzeigen #2 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Du hast schon richtig erkannt, dass man (statische, d.h. in Daedalus definierte) Arrays nicht einfach mit einer Variable indizieren kann - der Bytecode kann diese Operation einfach nicht abbilden. Allerdings gibt es dafür die Ikarus-Funktionen MEM_WriteStatArr(array, index, value) bzw. MEM_ReadStatArr(array, index). Für String-Arrays gibt es dann jeweils noch MEM_WriteStatStringArr/MEM_ReadStatStringArr.

    Die Listen von LeGo sind einfach verknüpfte Listen und keine Arrays. Sie unterstützen außerdem nur Integer als Werte, was aber mittels Pointern/Handles keine Einschränkung darstellt.

  3. Beiträge anzeigen #3 Zitieren
    Lehrling Avatar von dataframe
    Registriert seit
    Mar 2021
    Beiträge
    25
     
    dataframe ist offline
    Hey Lenoha, danke für deine Antwort - dann liege ich ja zumindest nicht falsch .
    Gibt es irgendeine Art von Doku bzgl. dem Umgang mit Pointern + Daedalus? Habe einige male im ScriptBin vorbeigeschaut und sowas wie _^(variable) oder _@(variable) gesehen?

    Liege ich richtig, dass ich folgendermaßen solch eine Liste initialisiere:

    var int collection;
    const string s1 = "Hallo";
    const string s2 = "Welt";
    const string s3 = "Lego > Playmobil";

    func init(){ // wird extern aufgerufen
    collection = List_Create(0);

    // wie kann ich die Konstanten mittels List_Add nun zur Liste hinzufügen?
    List_Add(collection, ...)
    };

    Vielen dank schonmal für die Zeit und evtl. Hilfe!

  4. Beiträge anzeigen #4 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    _^ bzw _@ sind Funktionen aus Ikarus (diese Funktionsamen sind zwar ungewöhnlich, aber gültiges Daedalus). Sie sind vergleichbar mit dem * bzw. & Operator aus C. So kann man eine Objektvariable mit einem Pointer befüllen via _^(ptr) und die Adresse eines Objektes bzw einer Variablen herausfinden via _@.


    Es gibt nicht so viele Gründe, tatsächlich eine Liste zu verwenden, vermutlich möchtest du einfach ein dynamisches Array, wie man es z.B. aus C++ (std::vector) kennt. Ein solches Array kannst du via MEM_ArrayCreate() anlegen und dann mit Integern via MEM_ArrayInsert(array, value) befüllen.

    Da du aber ja Strings hast, musst du irgendwie eine Verknüpfung Integer<->String schaffen. Falls deine Strings alle Konstanten sind, kannst du am einfachsten ein großes statisches Array anlegen und nur Indizes in dieses Array speichern. Falls du auch dynamische Strings verwendest, solltest du diese Strings in einer eigenen Klasse speichern via PermMem/LeGo und dann das Handle (etwas ähnliches wie ein Pointer) verwenden:


    Code:
    var int stringHandle; var _string s; // Von LeGo definierte Klasse, die als einzigen Member einen String enthält
    stringHandle = new(string@); // String@ ist eine (leere) Instanz von '_string' - wie ein Prototyp.
    s = get(stringHandle); // get ist das Äquivalent zu _^(), d.h. wir "dereferenzieren" hier das Handle
    s.s = "foobar";
    
    // Jetzt kannst du den Integer 'stringHandle' z.B. in einem Array speichern. Später kannst du dann mittels get() wieder auf den enthaltenen String zugreifen.

  5. Beiträge anzeigen #5 Zitieren
    Lehrling Avatar von dataframe
    Registriert seit
    Mar 2021
    Beiträge
    25
     
    dataframe ist offline
    Ich habe das Problem mittlerweile folgendermaßen gelöst:

    const int index = 0;
    const string myArray[4] = { "foo", "bar", "hallo", "welt" };
    var string current = MEM_ReadStatStringArr(myArray, index);

    D.h. mittels index kann flexibel auf die String-Instanzen im Array zugegriffen werden - ersetzt man die vier durch eine Konstante, oder fragt eben auf 4 ab, kann man von Anfang bis Ende iterieren oder invaliden Array zugriffen vorbeugen - nachdem ich Tage nach solch einer Lösung gesucht habe bin ich zufrieden damit - vielleicht hilft es ja dem einen oder anderen.

    @Lehona - Danke nochmal für deinen Input!

    Edit - zu beachten ist natürlich, dass es sich hierbei ausschließlich um String-Arrays handelt - wie mit anderweitigen, evtl. eigenen Klassen-Instanzen, umgegangen wird müsste ich nochmal ermitteln =).

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide