Lua Tabellen teilweise freigeben?

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
  • LUA Source Code
    1. ar_fw_einfahrt={zugname="NULL",flag="NULL"}
    2. table.insert(ar_fw_einfahrt,{3,109,1,1,0})
    3. table.insert(ar_fw_einfahrt,{3,118,1,1,0})
    4. table.insert(ar_fw_einfahrt,{4,124,1,1,0})
    5. Wie kann ich NUR die inserts löschen, so daß zugname und flag nicht gelöscht werden?
    6. mit table.remove über alle Elemente von 1 bis #ar_fw_einfahrt?
    7. oder von 3 bis #ar_fw_einfahrt?
    8. oder ?

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

  • HaNNoveraNer


    Hallo Thomas, sieh dir das an.


    table.remove(table[,pos])


    Entfernt das Element an der Position pos aus table, wobei andere Elemente falls notwendig nach unten verschoben werden, um Platz zu schaffen. Liefert den Wert des entfernten Elements. Der Standardwert für pos ist n, wobei n die Länge der Tabelle ist, so dass der Aufruf table.remove(t) das letzte Element der Tabelle t entfernt.


    Gruß Martin


    PS: so geht es


    laenge = #ar_fw_einfahrt


    for t = laenge,1,-1

    do

    table.remove(ar_fw_einfahrt,t)

    end

    Wortmann Terra: Intel® Core™ i7-8700K CPU 3.7GHz, RAM 32GB, GIGA NVIDIA GTX 1080 Ti 11GB, SSD 256GB, HD 3TB, Windows 10 Pro 64 Bit 1809


    EEP12 u. EEP13.2 Expert Patch2 + Plugin1,2, EEP14.1 Expert Patch2,Plugin 1,EEP15.1 Expert Patch 2,Plugin 1,EEP16 Patch 3

    The post was edited 1 time, last by martin51 ().

  • Soweit ich dich verstehe, willst du den "Array-Teil" (durchnummerierte Indizes) löschen.

    Das geht vermutlich am einfachsten, indem du mit einer Schleife von 1 bis #ar_fw_einfahrt alle Elemente auf nil setzt.

    table.remove solltest du nicht brauchen, weil keine Folgeelemente aufrutschen müssen.


    Ich empfehle dir übrigens mal einen Blick ins Lua-Manual (nicht das von EEP, sondern das von der Sprache selbst). Dort solltest du noch einige Hintergrundinfos dazu finden, wie Zahlen und Nicht-Zahlen als Tabellen-Indizes zusammenwirken (oder es eben nicht tun).


    Viele Grüße

    Benny

  • So könnte es gehen:


    Gruß Dieter

    1.MSI 17,3" Intel® i7-8750H 16GB SSD + HDD GeForce® GTX 1060 »GV72 8RE-013DE (00179E-013)

    2. PC:Win10/64, i7-7700K, 4.2 GHz, GPU GTX 1070/8 GB, 16 GB RAM(DDR4), SSD 960 Evo 500GB, Ilyama PL2490
    EEP 6.1 - EEP 15 E, HomeNos 15


    Ich wünsche mir eine freizügige Script-Sprache und eine leistungsfähige Grafik Engine für EEP.
    Ein Leben ohne EEP ist möglich, aber sinnlos, so ganz sicher bin ich mir nicht mehr.

    "mal was ganz Einfaches" "rundum sorglos Paket"

    Parrys YouTube Videos
    https://www.twitch.tv/parry_36/

  • Nochmal zur Erklärung :

    Mein Code zeigt den Aufbau meiner Tabelle.


    Nun muss die Tabelle neu generiert werden mit komplett anderen insert Arrays.

    Allerdings sollten dabei die beiden Inhalte von flag und zugname nicht gelöscht werden,

    weil sie später noch gebraucht werden.

    Irgendwie funktioniert das bei mir nicht.


    Wenn ich alle ab Index 1 auf nil setze, erzeugt dann das neue insert wieder einen Eintrag bei Index 1? Und werden flag und zugname dabei nicht geändert oder gelöscht?

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

  • Vorschlag:

    Lösch jede Untertabelle dann, wenn du sie verwendest.


    Die Funktion table.remove() gibt das gelöschte Element aus. Du kannst also in einem Rutsch etwas aus der Tabelle entnehmen und rauskicken. Dazu musst du nur den Rückgabewert in einer Variablen auffangen. Das entnommene Element darf auch (wie in deinem Fall) eine komplette Untertabelle sein.


    Im folgenden Beispiel

    • füge ich drei Arrays in die Tabelle ein
    • lese alles (einschließlich der feststehenden Spaltennamen) in einen String
    • lösche dabei einzeln jeden Array, den ich an den String anhänge
    • gebe den String aus
    • füge anschließend drei neue Arrays in die (jetzt leere) Tabelle
    • um anschließend alles (samt Spaltentiteln) ein zweites Mal auszulesen.



    Das müsste recht nah an dem sein, was du suchst.


    In EEP wird die Ausgabe unsauber formatiert sein, weil das Ereignisfenster keinen Tabsprung \t kennt.


    In ZeroBrane sieht es fein aus.

    in Lua: demo ebenfalls


    Beachte bitte:

    Wenn du ein Element entnimmst, dann rücken die nachfolgenden auf.

    Wenn du also mit for ... do Elemente entnimmst, dann darfst du den Iterator nicht als Index verwenden!

    LUA Source Code
    1. for iterator = 1, #Tabelle
    2. table.remove(Tabelle, iterator) -- GEHT SCHIEF!
    3. end

    weil schon nach dem ersten Durchlauf keine #Tabelle Elemente mehr vorhanden sind, sondern eins weniger. Ist die Hälfte der Einträge gelöscht, dann greift diese Schleife ins Leere.

  • Hallo Götz


    Ich bin natürlich in das Fettnäpfchen getreten und habe diese iterator Schleife programmiert.


    Sehr verwirrend diese LUA Tabellen.

    Daher habe ich noch eine Frage:

    Die Beispieleinträge "Spalte1" bis "Spalte3" belegen doch auch Position in der Tabelle?

    Ich hätte jetzt vermutet, die sind an Position [1] bis [3] und ein erstes insert würde [4] erzeugen.

    Das ist aber wohl nicht so? Wo liegen die denn in der Tabelle?

    WIe kann ich z.B. nur den Eintrag bei "Spalte2" aus der Tabelle entfernen?


    Danke und Gruß

    Thomas

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

  • Die Beispieleinträge "Spalte1" bis "Spalte3" belegen doch auch Position in der Tabelle?

    Ja, aber diese Zellen haben Namen und sind nicht nummeriert.

    Eine Zelle hat entweder einen Namen (String) oder eine Nummer (Integer) als Bezeichner. Nie beides.


    LUA Source Code
    1. Beispiel = {
    2. ["Spalte1"] = "Wagen",
    3. ["Spalte2"] = "Ladung",
    4. ["Spalte3"] = "Tonnen",
    5. [ 1 ] = {"Smr 35", "Bretter", 2.5},
    6. [ 2 ] = {"Es045", "Kies", 4.2},
    7. [ 3 ] = {"Es045", "Sand", 1.9}
    8. }

    Andere Programmiersprachen unterscheiden zwischen Listen (mit nummerierten Einträgen) und Tabellen (mit Zellen, die Namen haben). Lua erlaubt beides in einer Tabelle, behandelt die Inhalte aber genauso unterschiedlich.



    WIe kann ich z.B. nur den Eintrag bei "Spalte2" aus der Tabelle entfernen?

    Indem du diesem Platz den Wert nil zuweist

    Beispiel.Spalte2 = nil



    Benny hatte dir empfohlen in der Lua-Doku nachzulesen, wie Tabellen in Lua behandelt werden.

    "Your heart's not in this, is it?"

    - Andy Millman -

    The post was edited 6 times, last by Goetz: Formattierung verbessert ().

  • Danke, der Aufforderung bin ich auch nachgekommen.

    Das da versteht man aber nur, wenn man es vorher schon weiß ;-)


    Also beginnen die "normalen" Felder IMMER bei 1.

    Alles was einen Namen hat, landet woanders und kann nicht mit remove entfernt werden.


    Und wenn man statt {Spalte1="Auto",Spalte2="Bahn"} schreibt {[1]="Auto",[2]="Bahn"}, landen die links bei den Namen und die rechts bei den "normalen" Feldern.


    Jetzt habe ich es hoffentlich kapiert.


    Meine Lösung sieht nun so aus:


    LUA Source Code
    1. function clear_array_einfahrt()
    2. while #ar_fw_einfahrt > 0 do
    3. table.remove(ar_fw_einfahrt,1)
    4. end
    5. end

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