Jump to content

Wie löscht man eine Objektvariable?


Erwin

Empfohlene Beiträge

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)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Andy
korrektur
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...