Timba Geschrieben 2. November 2021 Geschrieben 2. November 2021 Moin, irgendwie bin ich aus der Übung und brauche mal etwas Nachhilfe. Problem: Eine Objektvariable beinhaltet eine Tabelle. Darin sind zwei oder mehr Sätze, die jeweils aus zwei Zahlen und einem Booleschen Wert besteht. Wie werte ich die Einträge mittels grafischer EV aus? Mit Lua habe ich das vor zwei Jahren mal gemacht, aber mit grafischer EV muss das doch auch irgendwie gehen. Dann soll noch der erste Satz ans Ende gestellt werden. Gruß Timba
Goetz Geschrieben 2. November 2021 Geschrieben 2. November 2021 (bearbeitet) Hallo Timba, zuerst wählst du Variable (Liste/Tabelle) aus. Dann siehst du die Möglichkeit, die Tabelle und den Index anzugeben. Aber anstelle der Tabelle wählst du jetzt ein weiteres Mal Variable (Liste/Tabelle). Damit hast du den zweiten Index, den du benötigst. Jetzt kannst du an oberster Stelle die Hauptliste auswählen, als ersten Index eine der Untertabellen und als zweiten Index den gewünschten Punkt aus der Untertabelle: Beispielanlage: Untertabellen auslesen.mbp Viele Grüße Götz Bearbeitet 2. November 2021 von Goetz Ergänzungen
Timba Geschrieben 2. November 2021 Autor Geschrieben 2. November 2021 @Goetz, super, vielen Dank. Das hilft mir schon sehr weiter. Ich würde nur noch gerne die Datensätze rotieren lassen, also bei jedem Durchlauf den jeweils ersten Satz ans Ende stellen und dann immer nur auf den jeweils ersten Satz zugreifen. Allerdings könnte ich auch einen Zähler mitlaufen lassen und dessen Inhalt als Index nehmen. Rotieren der Datensätze wäre aber eleganter, finde ich. Geht das mit der grafischen EV überhaupt? Wenn ich mich recht entsinne hatte ich das mit Lua mal über eine Zwischenvariable realisiert, aber ist schon ne Weile her. Weiß gar nicht, ob die Dateien noch auf meinem Rechner sind. Gruß Timba
Goetz Geschrieben 2. November 2021 Geschrieben 2. November 2021 vor 20 Minuten schrieb Timba: Rotieren der Datensätze (...) Geht das mit der grafischen EV überhaupt? Leider nein, das müsstest du über Lua regeln.
Timba Geschrieben 2. November 2021 Autor Geschrieben 2. November 2021 @Goetz, irgendwas ist noch falsch. satz = vehicle.variables["Fahrplan"][1] print(satz.Dauer,satz.Ziel,satz.Halt) table.remove(vehicle.variables["Fahrplan"],1) table.insert(vehicle.variables["Fahrplan"],satz) Der Datensatz wird korrekt in die Hilfsvariable eingelesen (mittels "print" überprüft). Der erste Datensatz wird korrekt gelöscht. Aber der zwischengespeicherte Datensatz wird nicht angefügt. Warum nicht? Ist doch alles richtig ... oder?
Goetz Geschrieben 2. November 2021 Geschrieben 2. November 2021 vor 1 Minute schrieb Timba: Warum nicht? Daran hänge ich auch gerade, Timba. Ich hatte versucht das letzte Beispiel für dich umzuschreiben: local t = $("Ereignisse").variables["Beispiele"] table.insert(t, table.remove(t, 1)) $("Ereignisse").variables["Beispiele"] = t Das ist etwas kompakter, aber im Prinzip dasselbe, was du auch gemacht hast. Dein Ansatz ist vollkommen richtig. Wenn ich das "standalone" in Lua Demo mache, klappt es einwandfrei: Beatles = {"John", "Paul", "George", "Ringo"} local t = Beatles table.insert(t, table.remove(t,1)) Beatles = t for k, v in ipairs(Beatles) do print(v) end Aber in der EV verliere ich mein Element. Es macht in der EV auch keinen Unterschied, ob ich das Element, welches ich mit table.remove() entferne, zunächst in einem Zwischenträger ablege.table.insert() schreibt das entfernte Element nicht zurück in t. Da scheint etwas kaputt zu sein, weil ich weiß, dass ich dieses Prinzip früher schon mit der EV benutzt habe. @Neo? Viele Grüße Götz
Timba Geschrieben 2. November 2021 Autor Geschrieben 2. November 2021 Ich hatte zwischenzeitlich eigene Versuche angestellt. Mit einem Schalter starte ich ein benutzerdefiniertes Ereignis mit dem Skript satz = $("BR 103").variables["Fahrplan"][1] print(satz.Dauer,satz.Ziel,satz.Halt) table.insert($("BR 103").variables["Fahrplan"],satz) Im Prinzip dasselbe wie oben, nur nicht mit Auslöser, sondern das Objekt wird explizit bezeichnet. Das funktioniert tadellos. Liegt's daran, dass "Auslöser" (vehicle) in Lua nicht mehr verstanden wird? Gruß Timba
Timba Geschrieben 2. November 2021 Autor Geschrieben 2. November 2021 (bearbeitet) @Goetz So, jetzt habe ich das Problem eingegrenzt. Wenn ich die Zeilen vertausche table.insert(vehicle.variables["Fahrplan"],satz) table.remove(vehicle.variables["Fahrplan"],1) also zuerst insert und danach remove, dann funktioniert es. Aber das ist doch totaler Quatsch, oder? Bin gespannt, wie @Neo das erklären kann. Widerspricht jeglicher Logik. Bearbeitet 2. November 2021 von Timba
Goetz Geschrieben 2. November 2021 Geschrieben 2. November 2021 vor 11 Minuten schrieb Timba: Aber das ist doch totaler Quatsch, oder? Ja, ist es auch für mein Verständnis.
Neo Geschrieben 2. November 2021 Geschrieben 2. November 2021 Hallo, die Variablen sind keine Lua-Tabellen, die mit table.insert oder table.remove bearbeitet werden können. Hinter den Variablen verbirgt sich ein Objekt, mit dem ihr mit den Variablen im Studio kommunizieren könnt. table.insert oder table.remove verändert daher die Objektreferenz (die selber eine Tabelle ist), nicht aber die Variablen, die hinter der Referenz stehen. Für das Ermitteln der Anzahl der Variablen (#) und das Iterieren (pairs) gibt es vom Studio überschriebene Meta-Tabellen (Götz weiß was das ist), weshalb diese Funktionen transparent mit der Variablen-Referenzen funktionieren. Für das Einfügen oder Löschen von Tabellen-Einträgen gibt es seitens Lua leider keine Funktion in den Meta-Tabellen, lediglich für das Setzen von Variablen. Viele Grüße, Neo
Goetz Geschrieben 2. November 2021 Geschrieben 2. November 2021 Verstehe. Mein Umweg über das lokale t war damit Blödsinn. Auf dem Weg erzeuge ich eine Kopie der Objektreferenz, aber keine neue Tabelle. table.remove() funktioniert mit einer Liste, die ich über die Objektreferenz erreiche. Die Funktion entfernt ein Element und lässt alle nachfolgenden aufrücken. Und sie liefert mir auch das entfernte Element zurück. Nur table.insert() scheitert. Wenn ich ein Element ans Ende anhängen möchte, dann kann ich herausfinden, wo das Ende ist und dann ein neues Element an der gewünschten Stelle erzeugen. Das funktioniert zuverlässig. (Und table.concat() klappt auch!) Deine Implementierung von Lua und das Zusammenspiel mit Objektvariablen ist bemerkenswert gut, Neo! Beispieldatei: Tabelle umschichten.mbp
Old Grey Geschrieben 2. November 2021 Geschrieben 2. November 2021 Hallo Timba, Du benutzt in Deinem Script die Anweisung Print zum prüfen der Variablen. Mir ist nur nicht ganz klar wohin die Werte ausgegeben werden. Ich vermute die Ausgabe erfolgt in der Ereignis Protokollierung, ich kann das im Moment leider nicht testen. Kannst Du das bestätigen? Was passiert wenn die Variablen nicht korrekt sind? Gruß Old Grey
Timba Geschrieben 2. November 2021 Autor Geschrieben 2. November 2021 vor 44 Minuten schrieb modellbahn-old-grey: Ich vermute die Ausgabe erfolgt in der Ereignis Protokollierung, ich kann das im Moment leider nicht testen. Kannst Du das bestätigen? Genau so ist es! Im Protokoll findest du in schicker grüner Schrift die Ausgabe des Print-Befehls. Die einzige Möglichkeit, Funktionen innerhalb eines Lua-Scripts zu überprüfen. So weit es das MBS betrifft, meine ich.
Timba Geschrieben 2. November 2021 Autor Geschrieben 2. November 2021 vor 2 Stunden schrieb Goetz: Nur table.insert() scheitert. Hm ... aber nur, wenn ein remove-Befehl vorangeht. Ich habe nun den Zug einige Runden drehen lassen und dabei das Protokoll beobachtet, es funktioniert zuverlässig, wenn erst insert und dann remove kommt. Für die Funktion ist die Reihenfolge ja egal. Warum es funktioniert, weiß ich nicht, so wie ich Neo verstanden habe, kann das eigentlich nicht funktionieren, tut es aber. Keine Ahnung. Egal, was funktioniert, darüber meckere ich nicht. Gruß Timba
Goetz Geschrieben 2. November 2021 Geschrieben 2. November 2021 Hallo Timba, durch deinen Hinweis, dass table.insert() unter bestimmten Umständen richtig arbeitet, habe ich jetzt als Zwischenspeicher anstelle einer lokalen Lua Variable eine Modulvariable benutzt. Und dann kann man auch in der Reihenfolge remove -> insert arbeiten: Tabelle umschichten 2.mbp
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen.
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden