Jump to content

LUA Tabelle Remove


 Share

Recommended Posts

Eine Frage an die Programmierer. Ich möchte in einer Tabelle, die als Variable an ein Objekt (in diesem Fall Abzweigung) gebunden ist, einen Eintrag hinzufügen und auch wieder löschen. Das Eintragen klappt, das Löschen bei nicht bei Objekten.

Hier das konkrete Beispiel: ich möchte ein Fahrzeug stoppen, wenn eine Weiche/Abzweigung besetzt ist, und nach Freiwerden der Weiche/Abzweigung wieder beschleunigen. Hier die Prozedur:

local Obj = track.variables["Wartender_Obj"][1]
local Richtung = track.variables["Wartender_Nr"][1]

table.remove (track.variables["Wartender_Obj"], 1)
table.remove (track.variables["Wartender_Nr"], 1)

track.variables["besetzt"] = false

if Obj ~= $("") then
  $("starten"):invoke(Obj, Richtung, track)
end

Der Eintrag "Wartender_Nr" ist eine Zahl in der Tabelle, der Eintrag "Wartender_Obj" ist ein Fahrzeug in der Tabelle. Und zwar habe ich eine Tabelle angelegt, weil ja mehrere Fahrzeuge kommen könnten. Der Eintrag "Wartender_Nr" wird auch gelöscht. Die Länge der Tabelle beträgt nach Löschen 0 (ist also leer). Bei dem Eintrag "Wartender_Obj" wird nur das Objekt gelöscht. Die Länge der Tabelle beträgt nach Löschen 1 und wird immer länger (je mehr Fahzeuge die Abzweigung passieren).

Tabelle.thumb.jpg.3066b7966cb3e23f3ede62027077e61e.jpg

Wer weiß die Lösung?

Grüße

BauerHeini

Link to comment
Share on other sites

Das liegt nicht an Lua.
Deine Objekttabelle steht im MBS. Dort gelten andere Regeln (weil das MBS nicht in Lua programmiert ist.)

Probiere mal bitte, ob du den Tabellenplatz mit table.remove löschen kannst, wenn du ihm zuvor etwas anderes als ein Objekt zuweist.

Link to comment
Share on other sites

Ich habe eine Testprozedur angewendet per Tastendruck...

table.remove ($("Abzweigung").variables["Wartender_Obj"])

oder auch

table.remove ($("Abzweigung").variables["Wartender_Obj"], 1)

...aber das Element in der Tabelle wird nicht gelöscht, nur das Objekt.

Edited by BauerHeini
Link to comment
Share on other sites

Versuch doch mal bitte, dem Tabellenplatz zuerst einen anderen Wert zuzuweisen, bevor du ihn löscht.

$("Abzweigung").variables["Wartender_Obj"]  =  1            -- erst Objekt ersetzen
table.remove($("Abzweigung").variables["Wartender_Obj"],1)  -- dann löschen

 

Link to comment
Share on other sites

Hallo BauerHeini,

wenn Lua einen Eintrag aus einer Tabelle löscht, wird dieser nicht wirklich entfernt, sondern lediglich auf nil gesetzt. Das Studio kann aber nicht erkennen, ob eine Zuweisung von nil lediglich eine Objektreferenz auf nil setzen oder tatsächlich den Eintrag löschen soll. Daher Götz' Ratschlag, vorher das Objekt durch einen normalen Wert zu ersetzen, wobei Götz einen Fehler in seinem Beispiel hat. Korrekt müsste es lauten:

$("Abzweigung").variables["Wartender_Obj"][1] = 1           -- erst Objekt ersetzen
table.remove($("Abzweigung").variables["Wartender_Obj"], 1) -- dann löschen

Noch besser wäre jedoch die Verwendung von Listen statt Tabellen, denn das ist es, was du ja eigentlich erreichen willst, das Auflisten von Objekten. Ändere den Typ deiner Variable "Wartender_Obj" von Tabelle in Liste, dann wird ein Eintrag wirklich vollständig entfernt.

Viele Grüße,

Neo

Link to comment
Share on other sites

Hallo Neo,

vor 1 Stunde schrieb Neo:

Noch besser wäre jedoch die Verwendung von Listen statt Tabellen

das war mir auch bereits aufgefallen bei meinen Experimenten, die dem von BauerHeini ganz ähnlich sind. Als Liste, die wiederum Tabelleneinträge beinhalten kann, geht das Löschen dann ganz problemlos. Nur wenn man die Liste aus Lua heraus einrichten will wird standardmäßig immer eine Tabelle eingerichtet, die man dann manuell auf 'Liste' ändern muss. Wenn man also während der Testphase aus irgendeinem Grund die gesamte Liste löschen möchte funktioniert var = {} leider nicht, sondern man muss Eintrag für Eintrag löschen, oder eben wie gesagt manuell anschließend auf 'Liste' ändern. Ich vermute mal, dass es dafür aus Lua heraus keine Abhilfe gibt, da Lua selbst ja keine Listen kennt, sondern nur Tabellen.

Gruß Timba

Link to comment
Share on other sites

Hallo,

vor 17 Minuten schrieb Timba:

Ich vermute mal, dass es dafür aus Lua heraus keine Abhilfe gibt, da Lua selbst ja keine Listen kennt, sondern nur Tabellen.

korrekt, Listen sind etwas MBS-spezifisches. Wenn du von Lua aus eine leere Liste erstellen möchtest, dann funktioniert das nur über folgenden Umweg:

objekt.variables["Liste"] = {1}
table.remove(objekt.variables["Liste"])

Das Studio konvertiert eine Lua-Tabelle automatisch zu einer Liste, wenn es sich um eine "Sequenz" handelt.

Viele Grüße,

Neo

Link to comment
Share on other sites

Vielen Dank alle zusammen. Der Tip mit der Liste war erfolgreich. Jetzt läuft alles super(y):D

Jetzt möchte ich nur noch herauskriegen, was der Unterschied zwischen Tabelle und Liste ist.

Viele Grüße

BauerHeini

Edited by BauerHeini
Link to comment
Share on other sites

Am 17.1.2020 um 10:36 schrieb BauerHeini:

Unterschied zwischen Tabelle und Liste

Eine Liste hat fortlaufend nummerierte Zellen. in einer Tabelle hingegen hat jede Zelle einen Bezeichner.

Damit haben die Elemente einer Liste eine Reihenfolge, die einer Tabelle jedoch nicht.

Diese Unterscheidung wird in fast allen Programmiersprachen getroffen. Und somit auch im MBS. Wenn du eine Tabelle erstellst, dann wirst du bei jedem Element nach einem Namen gefragt. Bei einer Liste ist das nicht der Fall.

 

Lua fasst beide Arten von Elementen in einer Tabelle zusammen. In dieser Hinsicht ist diese Skriptsprache ein Exot. Aber die Tabellen und Listen in den MBS-Objekten haben nichts mit Lua zu tun. Lua hilft dir nur, sie zu verwalten.

Edited by Goetz
Schreibfehler korrigiert
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...