LUA indirekte Adressierung?

Achte bitte darauf, dass Du mit deinem Thema bzw. mit deiner Frage im richtigen Bereich bist.
Die Bereiche sind: Einstellungen im Forum, EEP aktuell ab EEP7 , Splines, Rollmaterialien, Immobilien, Landschaftselemente, Signale und Schaltung, Anlagenvorstellungen, Schnappschüsse Konstrukteure, EEP Treffen , Laberecke, Online - Handbuch EEP Vielen Dank für die Unterstützung das Forum übersichtlich zu halten.
Bilder/Fotos aus dem Internet sind nur als Link gestattet. Eigene Fotos, also Fotos aus dem realen Leben, sind erstens mit Eigenes Bild als Quellenangabe zu kennzeichnen und zweitens nur als Dateianhang im Beitrag zulässig. Bilder ohne Quellenangaben und Bilder dessen Quelle das Internet wie z. B. Google ist, werden gelöscht.
  • Hallo LUA Profis

    Ich möchte folgendes erreichen:

    In einem Array möchte ich die Adresse einer Variablen übergeben.

    Danach irgendwann den Wert der Variablen ändern.

    An anderer Stelle im Programm soll dann abgefragt werden, welchen Inhalt die Variable hat.

    Geht das? Wie?

    also:

    array={1,2, Adresse von z.B. "var1"}

    später:

    var1=55

    Dann:

    function test()

    local x

    x=Inhalt(array[3])

    print(x)

    end

    Ergebnis: 55

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager? , Hugo :aq_1:

  • Hallo Thomas ( HaNNoveraNer ),

    an Adressen von Lua-Variablen kommst Du (eigentlich) nicht heran. Das passt nicht zur Philosophie von Lua.

    Mir fallen aber spontan drei Wege ein, mit denen Du Dein Ziel erreichen kannst (Vorsicht, habe die Code-Fragmente nicht getestet):

    1. Du kannst den Namen einer globalen Variablen in die Tabelle aufnehmen und später über die Tabelle _G abfragen:
      array = {1, 2, "var1"} und x = _G[array[3]]
    2. Du kannst anstelle von var1 eine Tabelle nehmen, dann hast Du eine Referenz auf die Tabelle (und nicht eine Kopie der Variablen):
      var1 = {55}, array = {1, 2, var1} und x = array[3][1]
    3. Du kannst eine (anonyme) Funktion in die Tabelle schreiben:
      array = {1, 2, function () return var1 end} und x = array[3]()

    Mir persönlich gefällt Variante 3 am besten, aber das hängt davon ab, was Du genau machen willst.

    Gruß

    Christopher

    P.S.: Ich hätte wetten können, dass Benny (BH2) schneller ist. Und so war es auch.

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10, 22H2; EEP 6, 15 (Dev), 17.2 Plugins 1+2 (Dev); HomeNOS 17 (Dev)
    Laptop: Intel i7-12700H; 64bit; 2,7 GHz; 16GB RAM; GeForce RTX3070Ti (8 GB); Win 11, 23H2; EEP 6, 17 Plugins 1+2; HomeNOS 17 (User)

  • Hi Benny

    Die Tabelle (ein verschachteltes Array) soll geparsed werden. Sie sieht immer anders aus.

    Und wenn ich auf eine Variablenadresse treffe , soll der Inhalt ausgewertet werden.

    Identifizierung durch Kennung im Feld davor.

    Wie ginge das denn mit _ENV ?

    Oh, das geht aber schnell hier :)

    Danke Christopher.

    Punkt 3 klingt gut. Die Funktion würde ja immer aufgerufen, wenn ich an den Wert brauche.

    Egal wann und wo der Wert geändert wurde... das würde mir reichen.

    Punkt 1 scheint mir aber noch einfacher...

    Gruß

    Thomas

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager? , Hugo :aq_1:

  • Mit _ENV geht es genauso wie mit _G, wie cetz es in Beispiel 1 gezeigt hat.

    Ich bin mir aber ziemlich sicher, dass es für dein Problem auch eine Lösung ohne "indirekt referenzierte" globale Variablen gibt. Um dir da konkrete Tipps geben zu können (falls du das überhaupt willst), müsste ich aber am besten fertigen Code sehen, was genau du vorhast.

    Viele Grüße

    Benny

    PS cetz: Du warst dafür deutlich ausführlicher :be_1:

  • Mir ist aber gerade noch eine bessere Lösung? eingefallen.

    Ich könnte den Wert in einen TagText von einem "Baum-LsElement" schreiben.

    Und den LUA Modellnamen dann in das Array.

    Und den dann auswerten.

    Dann geht er auch bei eventuellem Abspeichern nicht verloren.

    Mit Slots will ich nicht arbeiten.

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager? , Hugo :aq_1:

    Einmal editiert, zuletzt von HaNNoveraNer (6. Januar 2020 um 09:57)

  • Mir ist aber gerade noch eine bessere Lösung? eingefallen.

    Das hängt wieder total davon ab, was Du konkret machen willst / brauchst.

    Wir sind schon von "Ich brauche die Adresse einer Variablen" zu "Ich brauche einen bestimmten, veränderlichen Wert auch nach Speichern / Neuladen der Anlage" gekommen.

    Und für letzteres ist es richtig, den Wert irgendwo zu "verhaften", sei es in einem Slot oder in einem "Bepperle" (Tag-Text). Ob Du dann noch den Weg über eine dynamische Auslese-Funktion in einer Tabelle brauchst, hängt von Deinem Anwendungsfall ab.

    Gruß

    Christopher

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10, 22H2; EEP 6, 15 (Dev), 17.2 Plugins 1+2 (Dev); HomeNOS 17 (Dev)
    Laptop: Intel i7-12700H; 64bit; 2,7 GHz; 16GB RAM; GeForce RTX3070Ti (8 GB); Win 11, 23H2; EEP 6, 17 Plugins 1+2; HomeNOS 17 (User)

  • Danke, alles gut.

    Ich brauche es eigentlich nicht für das Speichern/Laden.

    Innerhalb des Prozesses wird nicht gespeichert.

    Die indirekte Adressierung brauche ich sowieso, auch woanders.

    Die Beispiele waren dafür perfekt.

    Falls es interessiert kann ich aber gerne mal GENAU erklären, was ich gerade mache ;)

    Ich baue gerade eine Feuerwache mit 8 Garagen.

    Hier sollen die Rüstzüge per Zufall rausfahren (3 bis 8 Fahrzeuge zufällig) und nach erledigter Arbeit

    wieder in zufällig gewählte leere Garagen zurückfahren.

    Damit sieht der Bertrieb immer anders aus.

    Um so ein Fahrzeug dann zu bewegen, habe ich eine State Machine entwickelt, der ich über ein Array die Befehle gebe, was zu tun ist.

    Beispiel:

    {{WEICHE SCHALTEN, Nummer, Zustand, Timer},{ZUG GESCHWINDIGKEIT, NAME, GESCHWINDIGKEIT, Timer},... u.s.w. Timer ist die Zeit zwischen den Aktionen.

    Und diese State Machine soll nun auch auf Aktionen von "außen" warten. Z.B. wenn ein Fahrzeug an einer bestimmten Stelle angekommen ist oder irgendwas anderes passiert ist. Und dieses Ereignis soll dann eben einen Wert in eine Variable oder einen TAGTEXT schreiben, die ich im Array der StateMachine übergebe.

    Das neue Array Element wird nun also so aussehen:

    {EREIGNISWERT LESEN, "#256_Baum_1", 0,Timer}

    oder mit der anderen Lösung: {EREIGNISWERT LESEN, "var1", 0,Timer}.

    So kann die eine Aktion EREIGNISWERT LESEN in der Statemachine beliebge Variablen und Zustände abfragen.

    Alles klar? :bj_1:

    Wenn fertig, mache ich mal ein Video davon.

    Gruß

    Thomas

    EEP16.1 Patch 2, HomeNos15, Modellkatalog, Blender 2.8, Tauschmanager? , Hugo :aq_1:

  • HaNNoveraNer

    Der Weg über _ENV oder _G funktioniert deshalb, weil beides Tabellen sind.

    Der Name der Variablen ist in diesen Tabellen ein Bezeichner.

    Also kann man Bezeichner von Zellen einer Tabelle für eine indirekte Adressierung verwenden.

    Und wenn das geht, dann kannst du auch statt der Variablen ein Feld mit dem gewünschten Bezeichner in deiner Tabelle anlegen. Und dann diesen Bezeichner als String weiterreichen, in Tag-Texten speichern, per Code manipulieren etc. Das fände ich persönlich sauberer als eine separate Variable. Weil so zusammen bleibt, was zusammen gehört.

  • HaNNoveraNer

    Das kann ich gerne versuchen:

    Das ist leider kein schönes Beispiel.
    Da fehlt mir gerade der zündende Gedanke ...
    Aber du siehst zumindest, dass das Prinzip funktioniert.

    Einmal editiert, zuletzt von Goetz (7. Januar 2020 um 12:28)

  • Hallo Hannoveraner,

    schöne Idee, aber in einer Feuerwache stehen die Fahrzeuge immer gleich soweit ich weiß.

    Gruß

    Norbert

    PC: Intel(R) Core(TM) i3 CPU 530 @ 2.93GHz; NVidia GeForce GTX 460 mit 1024 MB GDDR5 RAM; 16 GB DDR3 RAM; 1 x 500 GB HDD mit WIN 10 Pro 64 2004; 1 x 1 TB für allg. Daten; 1 x 2 TB für EEP, EEP6.1 wg. Modellkonverter; MK, TM, ME, Tools von NR1, EEP15.1 mit Plugin 1, EEP16 mit allen Patches in Rente.