Jump to content

Empfohlene Beiträge

Geschrieben

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

Geschrieben (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:

1152213469_TabellemitUntertabellen.thumb.jpg.19626a466684ac61c134472a5779a040.jpg

 

Beispielanlage:  Untertabellen auslesen.mbp

Viele Grüße
Götz

Bearbeitet von Goetz
Ergänzungen
Geschrieben

@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

Geschrieben

@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?

 

Geschrieben
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

Geschrieben

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

Geschrieben (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 von Timba
Geschrieben

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

Geschrieben

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!  (y)

Beispieldatei:   Tabelle umschichten.mbp

Geschrieben

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

Geschrieben
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.

 

Geschrieben
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

Geschrieben

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

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...