Erwin Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 Ich habe einem Gleis eine Variable "GBS" hinzuggefügt vom Typ Objekt, die auf einen GBS-Baustein zeigt. Diese Variable lässt sich mit der EV nicht löschen, sie erhält beim Löschversuch den Wert [Leer], ist aber noch vorhanden. Jetz habe ich folgendes versucht: track.variables["GBS"] = 42 -- Jetzt ist "GBS" eine Zahl track.variables["GBS"] = nil -- Jetzt ist "GBS" verschwunden Was mich verwundert hat: Die Variable hat durch die Zuweisung einer Zahl einfach den Wertetyp geändert. Ist diese Vorgehensweise zum Löschen einer Objektvariable legitim? Oder habe ich da eine Schwachstelle ausgenutzt? Viele Grüße Reinhold (Erwin)
Andy Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 Hallo Reinhold; das ist okay so. Genau so wird sie entfernt. Das mit dem Ändern des Wertetyps hingegen ist 'schmutzig'. Da habe ich mir auch vorgenommen, Dein Skript nochmal intensiver zu betrachten, da dort anfänglich etwas auf 0 gesetzt wird, was später dann (möglicherweise - das wollte ich halt noch checken) mit einem String belegt wird. Da sollte man sich selbst auferlegen, den Typ fest zu halten. Ich bin mir auch gar nicht sicher, ob solche indirekten Casts nicht doch irgendwann mal einen Stop im Ereignisprotokoll auslösen. Gruß Andy
HaNNoveraNer Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 (bearbeitet) Hier stand was Falsches. Bearbeitet 19. Februar 2020 von HaNNoveraNer
Andy Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 vor einer Stunde schrieb HaNNoveraNer: Wenn Du "nil" reinpackst, ist der Topf leer. falsch. Dann ist der Topf weg.
HaNNoveraNer Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 Tatsächlich. Diese Eigenart vom MBS kannte ich noch nicht. Ich kenne nil oder NULL nur als Leer. also aaa=nil als false und aaa=1 als true aber aaa ganz weg bedeutet ja, man kann sie nicht mehr benutzen? Scheinbar wird sie automatisch erzeugt, wenn man was Neues reinschreibt. Dann bräuchte man sie ja nicht mehr manuell anlegen, sondern könnte mit einem Benutzerdefinierten Ereignis alle Variablen einmalig automatisch anlegen. Wieder was gelernt...
Neo Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 Hallo, vor 3 Stunden schrieb Erwin: Diese Variable lässt sich mit der EV nicht löschen, sie erhält beim Löschversuch den Wert [Leer], ist aber noch vorhanden. es handelt sich hier um eine Komfortfunktion. In den meisten Fällen möchte der Nutzer nicht, dass eine Variable, die eine Objektreferenz enthält, gelöscht wird, nur weil man ihr "nil" zuweist. Die Variable bleibt so im Variablen-Editor sichtbar. Auf die Funktion hat diese Eigenart keinen Einfluss, weil Lua nicht unterscheidet, ob eine Variable nicht existiert oder nil ist. Viele Grüße, Neo
Erwin Geschrieben 19. Februar 2020 Autor Geschrieben 19. Februar 2020 @Neo: Ich denke, es ist in Ordnung, dass "Variable == nil" und "Variable existiert nicht" in der EV gleich behandelt wird. Ich bin darüber gestolpert, weil ich in meinem Skript "Verbinden der Gleise eines Gleisstrangs mit einem GBS-Strang" die Gleise mit einer Variablen "GBS" versehe, die auf den zugehörigen GBS-Baustein verweist. Als ich diese Variable wieder entfernen wollte, um den Urzustand wieder herzustellen, stellte ich fest, das geht nicht: Die Variable erhält den Wert "nil", ist aber im Variablen-Editor noch zu sehen. Dann habe ich herumgespielt, und mit dem Trick Weise der Variablen einen Zahlenwert zu Weise der Variablen den Wert nil zu konnte ich die Variable tatsächlich löschen. @Andy: Es freut mich, wenn du dir mein Skript mal anschaust. Ich habe zwar Programmiererfahrung, aber mit Lua laufe ich gerade erst los, da macht man leicht etwas so, wie man es nicht machen sollte. Ein paar Eigenheiten habe ich schon entdeckt: Die globale Variable "Gleiszähler" wird von Lua akzeptiert, trotz des Umlauts! Eine lokale Variable "Verhältnis" wurde nicht akzeptiert! bei print wird die Ausgabe von "\n" anscheinend ignoriert. $("Hacks").variables["Gleiszähler"] ist möglicherweise zu umständlich. Einfach "Gleiszähler" würde beim ersten Zugriff eine globale Variable erzeugen. Viele Grüße, Reinhold
Andy Geschrieben 19. Februar 2020 Geschrieben 19. Februar 2020 (bearbeitet) vor 2 Stunden schrieb Erwin: Einfach "Gleiszähler" würde beim ersten Zugriff eine globale Variable erzeugen. Ich will nur da schnell drauf antworten, weil ich schnell noch mal raus muß, sonst gibt's heute nur noch trocken Brot: Mehr Antwort vielleicht morgen. Hab viel um die Ohren. Kann nur einfache schnelle Dinge momentan machen. Also: globale Variable ja - aber eine Lua-Variable. Du mußt sehr stark unterscheiden zwischen Modul/Objektvariablen und Lua-Variablen. Der allerwichtigste Unterschied: alle Lua-Variablen sind flüchtig! Sie sterben beim Speichern Schließen der Anlage (werden nicht gespeichert!). Nur hardgecodete initialisierte Lua-Tabellen 'bleiben'. Gruß Andy Bearbeitet 19. Februar 2020 von Andy korrektur
Erwin Geschrieben 20. Februar 2020 Autor Geschrieben 20. Februar 2020 Hallo, @Andy, lass dich bloß nicht hetzen! Das MBS ist ein Hobby, Haushalt und Familie gehen vor! Viele Grüße, Reinhold
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