Entweder LUA oder ich?

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
In the case of pictures that are attached to the article, the source must also be stated. This also applies to your own pictures, which were taken by you. Pictures without source information will be deleted!
  • Hallo und Frohes Neues Jahr aus Namibia.


    Ich stehe wirklich auf dem Schlauch!

    Im beigefügten Script werden die Werte v.an[j].tracknum und v.an[j].priority aus der Tabelle fs_str ausgelesen und den Werten v.tracknum und v.priority Zugeordnet. (Zeile 55/56)

    Danach wird alles in die Tabelle fs_wait Eingetragen (insert). (Zeile 57)

    Zur Kontrolle werden diese Werte Angezeigt, und sind korrekt. (Zeile 59/60 - Grün im Bild).


    Diese Werte in der Tabelle fs_wait sollten nun die Fahrstrassen schalten, je nach Fahrstrassen Nummer und Priorität.


    Bei der Auswertung der Tabelle fs_wait, sind diese Werte falsch. Es ist nur der letzte Wert, aber zwei Mal vorhanden:

    Tracknumber: 3 / Priority: P (Rot im Bild) ( Zeile 70)



    Ich habe schon Einiges Versucht, z.B die neuen Werte in die Tabelle fs_str einzugeben und dann diesen Eintrag in die Tabelle fs_wait zu Kopieren. Immer dasselbe Resultat.

    In anderen Skripten habe ich schon ohne Probleme neue Werte in eine bestehende Tabelle eingefügt.


    Wie schon Gesagt: Ich stehe wirklich auf dem Schlauch!


    Bitte um Hilfe, Dank im Voraus, Gruss JPB

    Code

    Windows 11 Pro

    Motherboard Gigabyte Z690 Gaming X

    Intel(R) Core(TM) i9-12900 CPU 16-Core 24 Threads

    2 x NVIDIA GeForce GTX 1080

    2 x Dell U2713HM (DP) 2560 x 1440 (on GK 01)

    2 x Dell P2715Q 3840 x 2160 (on GK 02)

    6 x 6TB HD

    1 x 512GB SSD

    64 GB RAM


    EEP Expert Version Installed:

    16.4 Plug-In 4 und Update 2

    17.2

    EEP Zug Explorer/PlanEX 3.20/EEP Modell Explorer/Modell Katalog/Anlageverbinder EEP16/Tauschmanager 15/Home Nostructor V13/Bulkinstaller/uvm

  • Hallo Bottazzoli ,


    auf den 1. Blick kann ich in der 1. ipairs-Schleife keinen Fehler entdecken, was aber nicht heißt, dass dort nicht doch einer ist.


    In der 2. ipairs Schleife kann ich nicht erkennen, wie der Ausdruck aus fs_wait erfolgt.

    Auch scheint der Ausdruck nicht an der Stelle zu erfolgen, denn im Foto sind andere Ausdrucke dazwischen.

    Nutze doch mal in der 2. ipairs-Schleife direkte print-Befehle (wie in der 1.) und nicht deine eigenen Routinen.

    Fried-liche Grüße:aq_1:


    Wer ein Problem mit mir hat, kann es behalten. Es ist ja schließlich seins.

  • Zeile 57 ist das Problem.

    Ich habe keine Ahnung, was in fs_str steht, sehe aber, dass es eine komplexe Datenstruktur aus verschachtelten Tabellen ist.

    In Zeile 55 und 56 werden zwei Felder (mit Zeichenketten indizierte Tabelleneinträge) erstellt oder überschrieben. Dann wird in der ominösen Zeile 57 die ganze Datenstruktur v in die Tabelle fs_wait eingefügt. Im nächsten Schleifendurchlauf von j (ab Zeile 53) wird dieselbe Datenstruktur v weiter verändert. Das wirkt sich natürlich auch auf das aus, was bereits in die Tabelle fs_wait eingefügt war.

    Merke: Lua übergibt nur für einfache Datentypen "by value" an aufgerufene Funktionen; komplexe Datentypen, insbesondere Tabellen, werden "by reference" übergeben.

    Oder konkret: Mit v adressierst Du immer wieder denselben Speicherplatz. Und folglich kann man aus fs_wait auch nur den letzten Zustand von v auslesen.

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 15 (Dev), 17 (Dev); HomeNOS 14 (Dev)
    Laptop: Intel i5 3230M; 64bit; 2,6 GHz; 8GB RAM; GeForce GT740M (1 GB); Win 8.1; EEP 6, 13.2 Plugins 1+2; HomeNOS 13 (User)

  • Hallo Fried und cetz,

    vielen Dank für die Antworten.


    cetz: Einige v Einträge werden in der j Schlaufe geändert aber jedes Mal in den fs_wait.insert als neuen Eintrag gespeichert. Ich habe dies auch in der vorherigen Anlage so gemacht, hat immer funktioniert.


    Fried: Ja, ich habe versucht die Daten mit der print() Funktion zu Kontrollieren.

    Es wird deutlich, dass die Werte im dritten Record von fs_wait beim ersten Durchlauf richtig sind. Aber beim zweiten Durchlauf (wenn der vierte Eintrag generiert wird) verändert werden???????

    Die fs_str Struktur und der Code in Anhang.

    Gruss JPB

    Windows 11 Pro

    Motherboard Gigabyte Z690 Gaming X

    Intel(R) Core(TM) i9-12900 CPU 16-Core 24 Threads

    2 x NVIDIA GeForce GTX 1080

    2 x Dell U2713HM (DP) 2560 x 1440 (on GK 01)

    2 x Dell P2715Q 3840 x 2160 (on GK 02)

    6 x 6TB HD

    1 x 512GB SSD

    64 GB RAM


    EEP Expert Version Installed:

    16.4 Plug-In 4 und Update 2

    17.2

    EEP Zug Explorer/PlanEX 3.20/EEP Modell Explorer/Modell Katalog/Anlageverbinder EEP16/Tauschmanager 15/Home Nostructor V13/Bulkinstaller/uvm

  • cetz: Einige v Einträge werden in der j Schlaufe geändert aber jedes Mal in den fs_wait.insert als neuen Eintrag gespeichert.

    Nein, Euer Ehren.

    Es wird nichts "als neuer Eintrag" gespeichert (und – so steht es zwischen den Zeilen – vor Veränderung geschützt).

    Vielmehr erzeugst du nur einen neuen Eintrag, der auf immer wieder dasselbe v zeigt. Wenn Du v weiter verändert (was Du im nächsten Schleifendurchlauf tust), ändert sich damit auch die Speicherstelle, auf die der bereits "gesicherte" Eintrag in fs_wait verweist. Konnte ich mich jetzt verständlich machen? Es ist für die Fehlersuche wichtig, dass Du das verstehst.


    Gruß

    Christopher

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 15 (Dev), 17 (Dev); HomeNOS 14 (Dev)
    Laptop: Intel i5 3230M; 64bit; 2,6 GHz; 8GB RAM; GeForce GT740M (1 GB); Win 8.1; EEP 6, 13.2 Plugins 1+2; HomeNOS 13 (User)

  • Hallo Euer Gnaden cetz,

    Nein, ich verstehe es nicht. Bis heute habe ich in allen Programmiersprachen "Daten" in ein(e) Tabelle/File geschrieben und keine Indexe.

    Aber es könnte ja sein das LUA das anders Händelt?

    Darum habe ich in einer neuen Version die Daten für "tracknum" und "priority" ausgekoppelt von v.

    Diese werden in einem Slot gespeichert und danach in fs_wait kopiert.

    Das Ergebnis ist immer noch genauso falsch.



    Gruss JPB


    Windows 11 Pro

    Motherboard Gigabyte Z690 Gaming X

    Intel(R) Core(TM) i9-12900 CPU 16-Core 24 Threads

    2 x NVIDIA GeForce GTX 1080

    2 x Dell U2713HM (DP) 2560 x 1440 (on GK 01)

    2 x Dell P2715Q 3840 x 2160 (on GK 02)

    6 x 6TB HD

    1 x 512GB SSD

    64 GB RAM


    EEP Expert Version Installed:

    16.4 Plug-In 4 und Update 2

    17.2

    EEP Zug Explorer/PlanEX 3.20/EEP Modell Explorer/Modell Katalog/Anlageverbinder EEP16/Tauschmanager 15/Home Nostructor V13/Bulkinstaller/uvm

  • Also hier mal ein ganz kleines Lua-Programm, um die Logik zu erklären:

    Wird es jetzt klar?


    Gruß

    Christopher

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 15 (Dev), 17 (Dev); HomeNOS 14 (Dev)
    Laptop: Intel i5 3230M; 64bit; 2,6 GHz; 8GB RAM; GeForce GT740M (1 GB); Win 8.1; EEP 6, 13.2 Plugins 1+2; HomeNOS 13 (User)

  • Hallo Christopher,

    Ich glaube es Dir. Nur warum hat es, und tuet es immer noch, mit meinem alten Code funktioniert? Zeile 31, 40, 51 table. Insert(fs_xxx,v)

    v.trainname, v.routename, v.nexttime und v.trainspeed wurden ebenfalls bei jedem Durchlauf verändert. Die Informationen in fs_wait waren immer korrekt.

    Wo liegt der Unterschied, wie kann ich es zum Laufen bringen?

    Mein Ziel ist die gesamten Informationen zum Ablauf in die einzige Tabelle fs_wait zu bringen, um eine weitere Bearbeitung beim Auslesen der Tabelle zu Vermeiden. Mit meiner großen Anlage und dem alten code kommt EEP ins Schwitzen und die Durchläufe verlängern sich.

    Sommit sollten z.B. in der Tabelle fs_wait für das Signal 14 zwei Einträge für (Gleis 2 / Gleis 3) mögliche Gleise stehen. Der Zug würde das erste Freie Gleis benutzen und danach beide Einträge löschen. Das Gleis Eins darf er nicht benutzen, da reserviert für einen Zug mit dem Namen GL1 (in diesem Beispiel priority = "E").


    Danke für die Mühe,


    JPB

    Windows 11 Pro

    Motherboard Gigabyte Z690 Gaming X

    Intel(R) Core(TM) i9-12900 CPU 16-Core 24 Threads

    2 x NVIDIA GeForce GTX 1080

    2 x Dell U2713HM (DP) 2560 x 1440 (on GK 01)

    2 x Dell P2715Q 3840 x 2160 (on GK 02)

    6 x 6TB HD

    1 x 512GB SSD

    64 GB RAM


    EEP Expert Version Installed:

    16.4 Plug-In 4 und Update 2

    17.2

    EEP Zug Explorer/PlanEX 3.20/EEP Modell Explorer/Modell Katalog/Anlageverbinder EEP16/Tauschmanager 15/Home Nostructor V13/Bulkinstaller/uvm

  • Hallo Bottazzoli ,


    ich verstehe zwar nicht Deinen gesamten Code, weder den alten noch den neuen. Aber ich glaube, das muss ich auch gar nicht.

    Der entscheidende Unterschied ist, dass Du in Deinem alten Code (den aus Deinem letzten Beitrag) keine verschachtelten Schleifen hast. Bei for k,v in pairs (fs_str) do bekommst Du einen Schlüssel k (den Du gar nicht verwendest) und einen Verweis v in die Tabelle fs_str. Mit v machst Du irgend etwas und fügst unter bestimmten Bedingungen dieses bearbeitete v in irgendeine Tabelle ein.

    Im neueren Code (in einem Deiner früheren Beiträge) versuchst Du, das v aus der äußeren Schleife mehrfach zu verwenden, nämlich in der inneren Schleife for i = 1, #v.an, 1 do. Bei jedem Schleifendurchlauf veränderst Du v immer weiter und hängst es (ggf. mehrfach) an eine Zieltabelle an. Dabei übersiehst Du, dass v dadurch nicht "weggesichert" ist. Vielmehr ändert sich das, was Du an die Tabelle gehängt hast, im nächsten Schleifendurchlauf weiter, weil sowohl v als auch der letzte Eintrag in der Zieltabelle auf ein und dieselbe Speicherstelle zeigen. Erst im nächsten Durchlauf der äußeren Schleife zeigt v auf etwas Neues (nämlich auf den nächsten Eintrag von fs_str), und das, was Du vorher an die Zieltabelle angehängt hast, ist (einigermaßen) vor weiterer Veränderung geschützt.

    Besser kann ich es jetzt nicht mehr erklären.


    Gruß
    Christopher

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10; EEP 6, 15 (Dev), 17 (Dev); HomeNOS 14 (Dev)
    Laptop: Intel i5 3230M; 64bit; 2,6 GHz; 8GB RAM; GeForce GT740M (1 GB); Win 8.1; EEP 6, 13.2 Plugins 1+2; HomeNOS 13 (User)

  • Hallo Christopher,

    vielen Dank für die Mühe. Supper erklärt, jetzt habe auch ich verstanden, wo der Unterschied ist. Also muss ich die Werte, der unter Tabelle sichern (eventuell in Slots) und nachträglich in einer separaten routine dies in fs_wait einfügen. Ich werde es Versuchen und Dir mitteilen, wenn es funktioniert. Auf jeden Fall sehr interessant, viel Gelernt.

    Ab dem Ersten Februar bin ich weg von zuhause, ich muss für za. 25 Tage mit der Anti Wilderei Truppe in den Busch. Also im Moment herscht Ruhe von meiner Seite.


    Gruss, JPB

    Windows 11 Pro

    Motherboard Gigabyte Z690 Gaming X

    Intel(R) Core(TM) i9-12900 CPU 16-Core 24 Threads

    2 x NVIDIA GeForce GTX 1080

    2 x Dell U2713HM (DP) 2560 x 1440 (on GK 01)

    2 x Dell P2715Q 3840 x 2160 (on GK 02)

    6 x 6TB HD

    1 x 512GB SSD

    64 GB RAM


    EEP Expert Version Installed:

    16.4 Plug-In 4 und Update 2

    17.2

    EEP Zug Explorer/PlanEX 3.20/EEP Modell Explorer/Modell Katalog/Anlageverbinder EEP16/Tauschmanager 15/Home Nostructor V13/Bulkinstaller/uvm