Jump to content

Arbeit mit Listen in der EV


Old Grey

Empfohlene Beiträge

Hallo,

bei der Arbeit mit Listen im MBS habe ich ein paar Probleme.

Wenn in eine Listenvariable anlege und dieser dann Einträge hinzufüge, werde diese automatisch aufsteigend nummieriert. Wenn ich einen Eintrag lösche, wird neu durchnummeriert. Soweit so klar.

Nun würde ich mir gerne für die Abfahrten aus dem Bahnhof mit einer Liste arbeiten. Die Anfragen sollten dabei natürlich hinten angefügt werden und erledigte Abfahrten oben gelöscht werden. Leider bekomme ich das mit der EV nicht hin. Ich muß für einen neuen Eintrag zwingend einen Index angeben. Den nächsten Eintrag könnte ich natürlich über eine Wiederholung mit einer Zählervariable ermitteln, das wäre aber zusätzlicher Aufwand.

Problematischer ist es aber mit dem Löschen des obersten Eintrags. Dann hat der erste Eintrag den Index 2 und nicht wie erwartet die 1. Ich gebe zu mit etwas Programmieraufwand lassen sich die Einträge mit einer Wiederholung nach oben schieben. Aber das ist ja nicht Sinn des Typs Liste.

Bei einem Test hatte mein Index folgende Werte: 0, 1, 2, 4, 5. Die Wiederholung erfaßte aber nur die Werte mit dem Index 1 und 2. Nachdem ich den Index 0 in 3 umbenannt habe, lief die Wiederholung über alle 5 Einträge.

Wo steckt hier mein Denkfehler????

_______________

Nächstes Problem:

Ich kann in der EV für den Index einer Liste auch einen String (z.B. Lok) eingeben. Mutiert die Liste dann zur Tabelle ? Bei einem Test in der EV konnte ich den Wert aus dem Index "Lok" an eine Variable übergeben. In der Wiederholung wurde dieser Eintrag ingnoriert. Alle vorigen (1-6) wurden verarbeitet.

Gruß Old Grey

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Leute,

kann mir denn niemand bezüglich der Listen in der EV einen Rat geben? Ich habe schon das ganze Forum und alle möglichen Videos auf Youtube durchgesehen und nichts passendes gefunden.

Ich bin der Meinung, daß im Forum jemand geschrieben hat, er würde die Bahnhofsausfahrten über eine Liste steuern. Leider finde ich den Beitrag nicht mehr. Die Suchfunktion war auch keine Hilfe.

Gruß Old Grey

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Thomas,

ich würde lieber die elegante Variante wählen. Ich bin in einem Phyton Tutorial auf die Listen und deren Verwendung gestoßen. Da brauche ich dann nur die Länge der Liste abfragen und solange die größer 0 ist, arbeite ich die Liste von oben nach unten ab. Unten werden die neuen Anfragen einfach angehängt.

Bis jetzt muß ich die Gleistimer solange neu starten, bis die Ausfahrt frei ist. Wenn ich Pech habe fährt dann der falsche Zug zuerst. Das würde mit der Liste einfacher und besser gehen. Die Theorie ist mir klar. Doch die Umsetzung mit der graphischen EV bekomme ich nicht hin. Wenn ich mit meinem Python Kurs fertig bin, kann ich das dann vermutlich mit LUA umsetzen. Aber ich will nicht zwei Sachen auf einmal machen.

Autßerdem würde mich die Umsetzung mit der graphischen EV interessieren.

Gruß Old Grey

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Listen in Objektvariablen sind eher mit Tabellen oder Dictionaries vergleichbar.

Aber du kannst die Liste temporär in eine Lua Tabelle kopieren.
darauf Lua Methoden wir table.remove() und table .insert() anwenden
und dann das Ergebnis wieder in die Variable zurück kopieren.

Die table.insert Variante siehst du in diesem Beispiel, dass ich gerade erst für Wüstenfuchs gebaut hatte:

B48D6FB2-F857-47B7-95A1-D66DB8FE4337

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Goetz,

ich stelle mir die Sache viel einfacher vor. Ich brauche nur eine Liste mit Zahlen (Gleisnummer) für die Reihenfolge. Alle anderen Werte und Objekte sind in gesonderten Listen gespeichert. Die Gleisnummer ist der Index mit dem ich dann auf die entprechenden Objekt (Fahrstraße schalten, Abfahrt usw.) zugreifen kann.

Gruß Old Grey

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Minuten schrieb modellbahn-old-grey:

ich stelle mir die Sache viel einfacher vor.

Viel einfacher?
Hast du mein Beispiel mal angeschaut? Und verstanden?

Listen in Objektvariablen kannst du nicht erweitern oder kürzen. Weil das keine dynamischen Listen sind.
Im Gegensatz zu Lua-Tabellen. Die sind immer dynamisch.

Mein Beispiel macht genau das, was du wünscht. 

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich glaube wir reden aneinander vorbei. Ich habe für jeden Bahnhof verschiedene Listen in den alle Objekte der Gleise, für jede mögliche Fahrstraße die Weichen mit Stellung, Gleisbelegung usw.

Bisher läuft für jedes Gleis ein Timer ab, mit dem die Indexvariable mit der Gleisnummer belegt wird. Ggf. gibt es noch eine Variable für die Ausfahrt. Anschließend wird das Ereignis Fahrstraße schalten aktiviert und alle kollidierenden Fahrstraßen blockiert.

Läuft nun ein Gleistimer ab und die Fahrstraße ist blockiert wird der Gleistimer solange neu gestartet bis die Fahrstraße geschaltet werden kann. Das ist für mich kein sauberer Programmierstil, da m.E. eine ziemliche Resourcenverschwendung. Ich habe bisher knapp 100 Bahnhofsgleise in mehreren Bahnhöfen.

Ich möchte wirklich nur bei Ablauf des Gleistimers die Gleisnummer in die Abfahrtabelle schreiben und wenn die Fahrstraßenschaltung wieder freigegeben ist den ersten Wert auslesen und anschließend löschen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 25 Minuten schrieb modellbahn-old-grey:

Ich möchte wirklich nur bei Ablauf des Gleistimers die Gleisnummer in die Abfahrtabelle schreiben und wenn die Fahrstraßenschaltung wieder freigegeben ist den ersten Wert auslesen und anschließend löschen.

das habe ich verstanden, Old Grey

und wenn du mein Bispiel studieren würdest, dann könntest du sehen, warum es die Antwort auf deinen Wunsch ist.
Dass ich im Beispiel etwas anderes als Gleisnummern in die Liste schreibe, ist doch für das prinzipielle Verständnis ganz egal.

Also: Hast du dir das Beispiel angeschaut?

Bearbeitet von Goetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Old Grey,
ich habe sowas ähnliches bereits umgesetzt. Allerdings mit Arrays. Und das Timing ist nicht an Gleisen festgemacht, sondern an Loks, denn davon gibt es in der Regel weniger.
Ich habe mehr als ein halbes Dutzend Bahnhöfe, und um die 100 vordefinierte Fahrstrecken und andere Aktionen. Das liegt alles in sehr großen Lua-Tabellen, damit es halbwegs editierbar ist. Und ja - ist ein Fahrweg blockiert, wird solange retriggert, bis er möglich ist. Kleine Abfahrzeitfehler, die zu Widersprüchen führen, lassen sich damit schön glätten. Ein einziger zu großer Fehler und das Chaos beginnt! (Wie in echt :D)
Jedenfalls, mit über 100 Gleisen wirst Du nicht glücklich werden. Das prophezeihe ich schon mal. Ich habe jetzt mit einem Schattenbahnhof einen 24-Std.-Ablauf mit 20 Loks. Danach beginnt alles wieder von vorne. Es ist praktisch nicht mehr möglich auch nur noch eine weitere Lok zu integrieren und debuggen ist extrem zeitintensiv, weil man immer alles von vorne neu durchstarten muß. Jedwede Erweiterung würde die Ansicht der Anlage in einen nicht mehr zumutbaren Bereich bringen. Es gibt natürliche Limits!

Gruß
  Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe das Problem jetzt wie folgt gelöst:

Ich habe zwei benutzerdefinierte Ereignisse angelegt. Das Erste führt den Befehl table.insert aus und das Zweite den Befehl table.remove mit Übergabe an die Indexvariable aus.

Jetzt muß ich nur noch an den Übergabeparametern feilen um diese beiden Ereignisse global nutzen zu können.

Gruß Old Grey

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Old Grey

Ich finde, das ist ein interessantes Thema und ich möchte doch klärend noch meine Erfahrungen beisteuern:

Kann man nur mittels grafischer EV einen Eintrag aus einer Liste entfernen? - Ja kann man.
ein einfaches "Ereignis/Variable setzen" mit einem leeren Objekt als Wert bzw. wenn es sich um ein Objekt handelt mit z.B. einem leeren Ereignis lässt den Eintrag in der Liste verschwinden.

Kann man nur mittels grafischer EV Einträge einer Liste hinzufügen? - Selbstverständlich.
Hierzu muss man nur wissen, wieviele Einträge die Liste bereits hat, z.B. in einer eigens dafür vorgesehenen Variable gespeichert. Wenn man es nicht weiss, lässt man die Liste einmal durch eine Wiederholung sausen und zählt dabei die Einträge (Unschön).

Ist die Liste, aus der man den ersten Eintrag (Index 1) entfernt hat, immer noch eine Liste, die man in der EV mit einer Wiederholung durchlaufen kann? - Nein ist es nicht, auch wenn in der EV immer noch "Liste" steht.
Nur lückenlos durchnummerierte mit Index 1 beginnende Tabellen sind Listen, die man in der grafischen EV mit einer Wiederholung bearbeiten kann.

Gibt es eine Möglichkeit nur mit der grafischen EV (ohne LUA) den obersten Eintrag (Index 1) aus einer Liste zu entfernen und am Ende der Liste einen neuen Eintrag einzufügen? - Ja, gibt es, wenn es denn sein muss und auf die Gefahr hin, dass mich jetzt alle LUA Experten auslachen.listen.thumb.JPG.c784efb988d1df39910e5f252471a679.JPG

Wahlweise kann der oberste Eintrag natürlich auch statt 0 einen anderen Wert als Markierung erhalten.

Ich weiss auch nicht warum, aber ich habe an der grafischen EV einen Narren gefressen. Wahrscheinlich ist mir LUA zu einfach. Ein Problem mit der grafischen EV zu lösen - das ist eine Herausforderung! Manchmal geht es aber wirklich nicht.:)

Grüsse

Draisine

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 47 Minuten schrieb Draisine:

Ein Problem mit der grafischen EV zu lösen - das ist eine Herausforderung!

Eigentlich ist es aber genau andersherum gedacht:

Die grafische EV ist eine Unterstützung für all diejenigen, denen ein Skript zu abstrakt ist.
Sie soll die Verwaltung der Ereignisse erleichtern.

Und das tut sie auch in der Mehrzahl der Fälle.

Die Listenverwaltung ist eine der wenigen Ausnahmen. Und genau deshalb hat Neo die Möglichkeit, einzelne Dinge direkt in Lua zu erledigen: Damit man solche Fälle bequem in den Griff bekommt. Damit man die Verwaltung mittels Lua überall dort erweitern kann, wo eine grafische EV an ihre Grenzen stößt. Das sind neben der Listenverwaltung z.B. auch Formelberechnungen.

Besonders angenehm ist dabei, dass man solche kleinen Skripte bequem in die grafische EV integrieren kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Draisine,

mein erster Versuch der Umsetzung mit der graphischen EV in meiner Testanlage war ein ähnliches Monster wie Dein Beispiel. Da blickt man doch nach kurzer Zeit überhaupt nicht durch.

Heute gabs was Neues. Ich wollte 2 Wiederholungen ineinander verschachteln und bekam ständig eine Fehlermeldung. Im Script habe ich dann gesehen, daß in beiden Schleifen die Variablen t und i vorkamen. Nachdem ich gerade oben gelesen hatte, daß man in der EV auch Script einbetten kann (man lernt immer etwas Neues), habe ich das getan, die Variablen umbenannt und siehe da es lief problemlos.

Eigentlich wollte ich ja meine erste Anlage nur über die EV steuern, aber dafür hätte ich beim ersten Entwurf bleiben sollen. Jetzt ist sie dafür zu komplex geworden. Wie immer.

Und wenn mal ein Teilbereich halbwegs läuft, stellt man fest, das man das ja viel einfacher und eleganter lösen könnte und schreibt alles um.

Gruß Old Grey

Link zu diesem Kommentar
Auf anderen Seiten teilen

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