Frage zu einer Lua Abfrage

!!! 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.
  • Bei mir liefert EEPGetSignal einen Wert von 1.0

    Ja, das muss irgendwann geändert worden sein. Früher gab EEPGetSignal() einen int- Wert zurück, jetzt ist es unsinnigerweise ein float. Ich weiß nicht, wann das passiert ist, aber das sollte wieder zurück geändert werden.


    Die Sache ist wohl doch etwas komplizierter:


    c1 wird in allen Fällen als 1 ausgegeben (weil es 1 ist)

    c2 wird zweimal als 1 und einmal als 1.0 ausgegeben (obwohl es 1.0 ist)

    c3 wird in allen drei Fällen als 1.5 ausgegeben (weil es 1.5 ist)




    Die Wandlung von number zu string ist also in Lua unterschiedlich, je nachdem wie man die Zahl als Argument an print() übergibt und was die Zahl enthält.


    Ich kann jetzt nicht mehr sicher sagen, ob der Rückgabewert von EEPGetSignal() schon immer ein float war oder nicht. Aber ich glaube, dass ein float schon früher unangenehm aufgefallen wäre.

    Wenn es dir nur um die Ausgabe geht, dann kannst du den Text natürlich entsprechend formatieren. Wie das geht, findest du hier

  • In Lua gibt es nur den Datentyp "number", die Unterscheidung zwischen int und float wird zumindest nicht "nach außen hin" verbreitet. Laut Lua-Manual (einfach mal "integer" suchen) darf man die Unterschiede getrost ignorieren.

    In der Praxis sind bei mir noch keine Probleme aufgetaucht. Der Vergleich EEPGetSignal(1) == 1 funktioniert so, wie er soll. Ein vorheriges Runden ist nicht nötig.


    Ich vermute mal, die Änderung kam mit dem Wechsel von Lua 5.2 nach Lua 5.3 in EEP 14(?).


    Viele Grüße

    Benny

  • ... stellt sich die Frage, wo  halu / Peter die 1.0 bekommt?


    Er hat es ja nur im Kommentar geschrieben!




    :aq_1:


    Nebenfrage: funktioniert EEPTimeH und EEPTimeM nicht mehr?

    geschnallTTTTTTTTTTT:at_1:

    Intel i3-540 3,2GHz 8GB, RAID10, HD 6570 1GB, W7/64 Prof., EEP 6-6.1, 10-15, HN13+15, TM, "Schiefe Ebene 6 + 8", "Bahn2000", "Faszination der St. Gotthard-Nordrampe"

    MK, ModellKonverter 1.0 wo nicht mehr tut. Ganz schnell ausgeschrieben, wg. Mod-Drohung: Ansonsten ... :am_1:

  • Moin,

    durch eine Umwandlung von numerisch in string, bei der Verwendung in Verkettungen, ist wohl nicht immer

    das gleiche Ergebnis zu erwarten ???


    siehe Beispiel :



    Hintergrund meiner Anfrage:

    Ich möchte in einem String fester Laenge ein Digit austauschen ( die Ziffer aus einem Zaehlsignal ) hierbei bin ich

    auf diese Problematik gestossen.

    Wie ich diesen Fall umgehen kann ist nun bekannt.


    Danke fuer Euere Hilfe

    Hans

    EEP 15 Plugin 1
    Win 10 i7 3,5 GHz 16GB RAM mit Nvidia Gforce 970 4GB

    Erazer Win 10 i7 32GB RAM mit Nvidia Gforce 1070

    Tauschmanager, Hugo

  • Ich möchte in einem String fester Laenge ein Digit austauschen

    Dann musst du deinen String mit string.format() bilden.

    Den Link zum passenden Video habe ich im letzten Posting angegeben.


    LUA Source Code
    1. Zahl = EEPGetSignal(1)
    2. Text = string.format("%d", Zahl)
    3. print("Aus "..Zahl.." wird "..Text)


    Du kannst der Zahl mit string.format auch eine Anzahl Leerzeichen oder Nullen voranstellen, um bei kleinen Werten auf die gewünschte Länge zu kommen:

    LUA Source Code
    1. Text = string.format("%3d", Zahl) -- füllt mit Leerzeichen auf drei Stellen auf
    2. Text = string.format("%03d", Zahl) -- füllt mit Nullen auf drei Stellen auf


    Und du kannst die Umwandlung anders schreiben, wenn du entweder das Muster in eine Variable legst oder in runde Klammern setzt:

    LUA Source Code
    1. Muster = "%d"
    2. Text = Muster:format(Zahl)
    3. Text = ("%d"):format(Zahl)

    Bitte beachte bei dieser Schreibweise den Doppelpunkt anstelle des einfachen Punkts. Der setzt den Term vor dem Doppelpunkt als erstes Argument in die Funktion ein.

    "I was not born to follow"

    - Gerry Goffin -

    The post was edited 3 times, last by Goetz: Beispielskript hinzugefügt ().

  • Hallo,

    Danke Goetz.


    text = string.match(EEPGetSignal(1),".")


    Mit Pattern habe ich schon gearbeitet aber die dritte Moeglichkeit, mit : , war mir neu.


    Gruß Hans

    EEP 15 Plugin 1
    Win 10 i7 3,5 GHz 16GB RAM mit Nvidia Gforce 970 4GB

    Erazer Win 10 i7 32GB RAM mit Nvidia Gforce 1070

    Tauschmanager, Hugo

  • die dritte Moeglichkeit, mit : , war mir neu.

    Das Geheimnis des Doppelpunktes in Lua kannst du in diesem 10-minütigen Video ergründen, wenn du magst. Das handelt zwar vom Einsatz des Doppelpunktes bei Tabellen. Aber das Prinzip ist identisch. Was vor dem Doppelpunkt steht, wird hinter dem Doppelpunkt als erstes Argument eingesetzt.


    Die string.match() Methode würde ich persönlich nicht nehmen, weil sie wie print() das Ergebnis von EEPGetSignal() unkontrolliert in einen String wandelt. Die Funktion EEPGetSignal() gibt einen Wert vom Typ "number" zurück, string.match() benötigt als Argument aber einen String. Deshalb wandelt die Funktion die Zahl in einen String um. Und das hast du genauso wenig unter Kontrolle wie bei print(). Deshalb gibt es string.format() für die kontrollierte Umwandlung.

  • Ich vermute mal, die Änderung kam mit dem Wechsel von Lua 5.2 nach Lua 5.3 in EEP 14(?).

    Das kann stimmen, denn laut der offiziellen Lua-Dokumentation gibt es von Version 5.2 zu 5.3 u.a. folgende Änderungen:

    • The main difference between Lua 5.2 and Lua 5.3 is the introduction of an integer subtype for numbers. Although this change should not affect "normal" computations, some computations (mainly those that involve some kind of overflow) can give different results.

      You can fix these differences by forcing a number to be a float (in Lua 5.2 all numbers were float), in particular writing constants with an ending .0 or using x = x + 0.0 to convert a variable. (This recommendation is only for a quick fix for an occasional incompatibility; it is not a general guideline for good programming. For good programming, use floats where you need floats and integers where you need integers.)

    • The conversion of a float to a string now adds a .0 suffix to the result if it looks like an integer. (For instance, the float 2.0 will be printed as 2.0, not as 2.) You should always use an explicit format when you need a specific format for numbers.

      (Formally this is not an incompatibility, because Lua does not specify how numbers are formatted as strings, but some programs assumed a specific format.)


    Übersetzt laut Google:

    Der Hauptunterschied zwischen Lua 5.2 und Lua 5.3 ist die Einführung eines ganzzahligen Subtyps für Zahlen. Obwohl sich diese Änderung nicht auf "normale" Berechnungen auswirken sollte, können einige Berechnungen (hauptsächlich solche, die einen Überlauf beinhalten) unterschiedliche Ergebnisse liefern.


    Sie können diese Unterschiede beheben, indem Sie eine Zahl zu einem Gleitkomma machen (in Lua 5.2 waren alle Zahlen Gleitkomma), insbesondere Konstanten mit der Endung .0 schreiben oder eine Variable mit x = x + 0.0 konvertieren. (Diese Empfehlung dient nur zur schnellen Behebung gelegentlicher Inkompatibilitäten. Sie ist keine allgemeine Richtlinie für eine gute Programmierung. Verwenden Sie für eine gute Programmierung Gleitkommazahlen, wenn Sie Gleitkommazahlen und Ganzzahlen benötigen, wenn Sie Ganzzahlen benötigen.)

    Die Konvertierung eines Gleitkommas in eine Zeichenfolge fügt dem Ergebnis jetzt das Suffix .0 hinzu, wenn es wie eine Ganzzahl aussieht. (Der Float 2.0 wird beispielsweise als 2.0 und nicht als 2 gedruckt.) Sie sollten immer ein explizites Format verwenden, wenn Sie ein bestimmtes Format für Zahlen benötigen.


    (Formal ist dies keine Inkompatibilität, da Lua nicht angibt, wie Zahlen als Zeichenfolgen formatiert werden. Einige Programme haben jedoch ein bestimmtes Format angenommen.)


    Gruß Holger

    Mein Hauptrechner Marke Eigenbau:

    Hardware: Mainboard ASUS Crosshair Hero VI, CPU-Typ AMD Ryzen 7 1800X Eight-Core Processor, Speicher 64 GB DDR4-RAM, Grafikkarte ASUS AREZ DUAL Radeon RX580 8GB GDDR5-RAM, 4 Festplatten Gesamtkapazität 13 TB

    Betriebssystem: Windows 10 Pro Version 1903

    EEP-Software: EEP 5 bis EEP 15.1 Plugin 1 (aktiv in Nutzung nur EEP 15.1), Modellkatalog, Anlagenverbinder zu EEP 15.1, HOME-Nostruktor 15.0 (noch nicht in Nutzung), Hugo