Achte bitte darauf, dass Du mit deinem Thema bzw. mit deiner Frage im richtigen Bereich bist.
Die Bereiche sind: Einstellungen im Forum, EEP aktuell ab EEP7 , Splines, Rollmaterialien, Immobilien, Landschaftselemente, Signale und Schaltung, Anlagenvorstellungen, Schnappschüsse Konstrukteure, EEP Treffen , Laberecke, Online - Handbuch EEP Vielen Dank für die Unterstützung das Forum übersichtlich zu halten.
Bilder/Fotos aus dem Internet sind nur als Link gestattet. Eigene Fotos, also Fotos aus dem realen Leben, sind erstens mit Eigenes Bild als Quellenangabe zu kennzeichnen und zweitens nur als Dateianhang im Beitrag zulässig. Bilder ohne Quellenangaben und Bilder dessen Quelle das Internet wie z. B. Google ist, werden gelöscht.
  • Hallo EEPler,


    ich habe ein Verständigungsproblem.

    Code
    if EEPVer > 13.2 then print(EEPVer," > EEP-Version13.2") end --wird gedruckt, in Ordnung
    if EEPVer > 14.0 then print(EEPVer," > EEP-Version14.0") end --wird gedruckt, in Ordnung
    if EEPVer > 14.1 then print(EEPVer," > EEP-Version14.1") end --wird gedruckt, nicht in Ordnung, warum gibt es hier ein print?
    if EEPVer > 14.2 then print(EEPVer," > EEP-Version14.2") end --wird nicht gedruckt, in Ordnung

    Warum gibt es hier in Zeile 3 einen Ausdruck? Ich habe doch nur EEP14.1 und nicht größer, oder doch? :aw_1:

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)

  • Kann das an den Nachkommastellem liegen? Bzw. die Nummern die nach dem Punkt kommen? Ich hatte das irgendwie mal ausgedruckt und bekam mehr nach der ersten Kommastelle.

    Viele Grüße,
    Damian Rutkowski

    Acer Aspire 5750G, Intel® Core™ i5-2430M 2.4GHz with Turbo Boost up to 3.0GHz, NVIDIA® GeForce® GT 540M, Up to 4095 MB TurboCache™, 8 GB DDR3 Memory, 8 GB DDR3 Memory
    EEP 6, EEP 16 mit allen Updates, Patches und Plug-Ins (stets aktuell gehalten)

  • Hallo Damian ( Damian Rutkowski ) und alle anderen User,

    wie hast Du bei dem Befehl/ Funktion EEPVer mehr Stellen nach dem Komma/Punkt herausbekommen? Ich bekomme nur eine Stelle nach dem Punkt/Komma von EEP geliefert? :ma_1:

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)

  • Hallo Jörg,

    versuch mal folgenden Code:

    Code
    if (0.1 + 0.1 + 0.1 - 0.3) == 0 then
      print("Zahlen verhalten sich so, wie ich es erwarten würde")
    else
      print("Ich muss mehr über Floating Point Zahlen in Computern lernen")
    end
  • Hallo Götz ( @Goetz ),

    bei mir kommt else raus. Und ich dachte es sind feste Größen, welche mir EEP zurück gibt, also so wie ich es im print sehe.

    Nach deiner Gleichung kommt nie 0 (Null) raus, sondern für mich nur "Murks" . :ao_1:

    Ich teste weiter. Vielen Dank für den Hinweis/ Info, Götz.

    Noch eine Zusatzfrage zwecks Lua, kann man auch die Plugin's abrufen?

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)

  • Hallo,

    mich wundert eher, daß EEPVer hier scheinbar als Fließkomma-Zahl verwendet wird, ich hätte hier eigentlich eine Variable vom Typ String erwartet. Wie will man sonst Sub-Versionen (z.B. 14.1.0.2) abbilden? Leider kenne ich mich mit LUA (noch) nicht so aus. Normalerweise programmiere ich in Pascal, und da werden Datentypen sehr streng gehandhabt ...

    Gruß

    Gerhard

    i7-7800X (12x 4GHz), 32GB RAM | GeForce GTX 1080, 8GB RAM

    Win10Pro (v21H2):

    EEP16.4 (PI1,2,3); EEP17.1 (kein PI, nicht aktiv genutzt)

  • bei mir kommt else raus.

    Das ist korrekt.

    Und das hat nichts mit EEP zu tun.

    Dasselbe Ergebnis bekommst du auch mit anderen Lua Interpretern. Und auch mit anderen Programmiersprachen.

    Den Grund findest du in der Tatsache, dass alle Zahlen im Rechner binär dargestellt werden müssen. Fließkommazahlen im Dezimalsystem lassen sich aber nicht immer sauber ins Binärsystem übertragen.

    Ein Halb, ein Viertel und ein Achtel sind sauber ins Binärsystem übertragbar. Aber nicht ein Zehntel.

    So, wie ein Drittel nicht sauber ins Dezimalsystem übertragbar ist.

    Es kommt kein "Murks" raus, Jörg,

    Du entdeckst nur gerade einen interessanten Aspekt der Programmierung.

    kann man auch die Plugin's abrufen?

    Nein, das geht nicht.

    Einmal editiert, zuletzt von Goetz (23. Juni 2018 um 23:41)

  • Nach deiner Gleichung kommt nie 0 (Null) raus, sondern für mich nur "Murks" .

    Hallo Jörg :)

    bei Interesse lies mal zum (technischen) Verständnis Umrechnen einer Gleitkommazahl in die Gleitkommadarstellung und Zahlendarstellung in Programmen und numerische Probleme (Abschnitt Ungenauigkeiten durch die binäre Darstellung), bzw. als Video

    Edit:

    mich wundert eher, daß EEPVer hier scheinbar als Fließkomma-Zahl verwendet wird, ich hätte hier eigentlich eine Variable vom Typ String erwartet.

    Dem schließe ich mich an.

    Gruß Ingo

  • Hallo Tufftuff,

    was wirklich in EEPVer gespeichert ist (weil im Fließkomma-Format), lässt sich leicht sichtbar machen:

    Code
    print(EEPVer)
    print(tostring(EEPVer))

    Das einfache print() gibt 14.1 aus,

    während nach der expliziten Umwandlung in einen String mit tostring() 14.10000038147 als Ergebnis geliefert wird.

    Da hat Lua natürlich Recht, dass dies > 14.1 ist (wenn auch nur minimal).

    Code
    print(string.format("%.02f", EEPVer))

    Wenn Du aus der String-Bibliothek die Funktion format() mit dem Parameter "%.02f" einsetzt, dann erhälst Du als Ergebnis einen String mit (im Beispiel) 2 Nachkommastellen, also z. B. "14.10". Das ist zwar exakt reproduzierbar, hat allerdings den Nachteil, dass der Größer-Operator > u. U. nicht zum erwarteten oder gewünschten Ergebnis führt, weil nun Strings und nicht Zahlen verglichen werden. Testest Du aber auf Gleichheit

    Code
    v = string.format("%.02f", EEPVer) -- v enthaelt einen String!
    if v == "14.10" then
      ...
    else ...

    dann lassen sich die Versionen präzise Unterscheiden.

    Viele Grüße

    Der Trambahnfahrer

  • Hallo liebe Helfer,

    vielen Dank für eure Hinweise, Tipps und praktischen Beispielen. :aq_1:

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)

  • mich wundert eher, daß EEPVer hier scheinbar als Fließkomma-Zahl verwendet wird,

    Hallo Gerhard :)

    nach etwas Nachdenken fällt mir ein möglicher Grund ein. Als Zahl ist ein Konstrukt wie...

    Code
    if EEPver < 13 then
        print( "Es wird mindestens EEP 13 benötigt")
        return
    else
        -- die Funktion steht erst ab EEP 13 zur Verfügung
        EEPChangeInfoSwitch(1,"Dies ist ein Test")
    end

    ...etwas einfacher zu realisieren (siehe dazu auch das Beispiel im EEP LUA Manual).

    Gruß Ingo

  • nach etwas Nachdenken fällt mir ein möglicher Grund ein.

    Hallo Ingo,


    Du hast mit Deiner Ausführung sicherlich insofern recht, als daß das wahrscheinlich die ursprüngliche Intention der EEP-Programmierer war, als sie den Datentyp für "EEPVer" als numerisch festlegten.

    Und es funktioniert ja auch, solange nur die Hauptversion (z.B. 13.0) und noch keine Subversionen (13.1, 13.2 etc.) vorliegen. 13.0 ist als Fließkommazahl eindeutig darstellbar (identisch mit der Ganzzahl 13). Die Probleme tauchen mit den Subversionen auf ... und interessanterweise verwenden alle Beispiele im LUA-Manual nur den Sonderfall "Hauptversion ohne Subversion".

    Ich denke, daß man hier seitens der EEP-Programmierer die Konsequenzen nicht abgesehen hat. Zwar ist der Größenvergleich von Ganzzahlen zunächst unproblematischer als der Größenvergleich von Zahlen die als String gespeichert sind. Wenn aber Fließkommazahlen ins Spiel kommen, dürfte der geringfügige Mehraufwand, der bei "Stringzahlen"-Vergleichen berücksichtigt werden muß, gegenüber dem Mehraufwand bei Fließkomma-Vergleichen kaum noch ins Gewicht fallen.

    Es gibt aus meiner Sicht noch einen weiteren (logischen) Grund, warum ein String der bessere Container für eine Versions-Information ist: der Punkt bei z.B. "14.1" ist ja nicht als Dezimal-Punkt gedacht (im Sinne von "14 komma 1") sondern als Trennzeichen zwischen Hauptversion und Subversion. Das wird besonders deutlich, wenn noch Sub-Sub-Sub...-Versionen vorhanden sind (z.B. 14.1.0.2.0).

    Um ein Beispiel aus dem EEP-Universum zu nennen, verweise ich auf das Manual zum aktuellen EEP14.1-Anlagenverbinder ("Anlagenverbinder-Anleitung.pdf" in "\EEP14\Anlagenverbinder"). Der Anlagenverbinder selbst wird dort mit der Version "7.0.0.1" angegeben, als Zusatzprogramm zu EEP ab Version "14.1.0". Diese Versionsbezeichnungen wären als Fließkommazahl nicht mehr darstellbar ...

    Gruß

    Gerhard

    i7-7800X (12x 4GHz), 32GB RAM | GeForce GTX 1080, 8GB RAM

    Win10Pro (v21H2):

    EEP16.4 (PI1,2,3); EEP17.1 (kein PI, nicht aktiv genutzt)

  • Und es funktioniert ja auch, solange nur die Hauptversion (z.B. 13.0) und noch keine Subversionen (13.1, 13.2 etc.) vorliegen.

    Die Subversionen bringen keine Unterschiede in Lua. Und Plug-Ins können nicht über die Versionsnummer ermittelt werden.

  • Die Subversionen bringen keine Unterschiede in Lua.

    Hallo Goetz,

    die berühmte LUA-Codezeile

    Code
    print("Hey let's start, EEP Version is: ", EEPVer)

    bringt bei EEP14.1 folgendes Ergebnis:


    Hey let's start, EEP Version is: 14.1

    Die Subversion ".1" wird also durch LUA durchaus erkannt, ich verstehe daher Deine Aussage nicht ganz.

    @Trambahnfahrer hat das in Beitrag #9 ja auch schon sehr schön und noch viel ausführlicher gezeigt ...

    Gruß

    Gerhard

    i7-7800X (12x 4GHz), 32GB RAM | GeForce GTX 1080, 8GB RAM

    Win10Pro (v21H2):

    EEP16.4 (PI1,2,3); EEP17.1 (kein PI, nicht aktiv genutzt)

  • ich verstehe daher Deine Aussage nicht ganz.

    Da mit keinem Update neue Lua Funktionen hinzukamen ist es unwichtig, ob man die Subversionen ermitteln kann oder nicht. Die neuen Lua Funktionen wurden immer mit Plug-Ins hinzugefügt. Und die Subversion ist kein Hinweis darauf, ob das benötigte Plug-In installiert ist oder nicht.

  • es funktioniert ja auch, solange nur die Hauptversion (z.B. 13.0) und noch keine Subversionen (13.1, 13.2 etc.) vorliegen.

    Hallo Gerhard :)

    richtig, wobei aus für mich unverständlichen Gründen das aktuelle EEP 14 Update 1 Patch 2 die interne Version 14.0.0.1 trägt, während EEPVer 14.1 liefert. Die interne Versionsnummer macht für mich überhaupt keinen Sinn, die Rückgabe von EEPVer finde ich dagegen ok.

    interessanterweise verwenden alle Beispiele im LUA-Manual nur den Sonderfall "Hauptversion ohne Subversion".

    Das hat @Goetz ja bereits beantwortet. Ergänzend ist es so, dass EEPVer nur die Hauptversion und das Update, aber weder den Patchlevel noch installierte Plugins liefert. Ich gebe @Goetz hier recht, dass diese Angabe für LUA völlig ausreicht.

    Wenn aber Fließkommazahlen ins Spiel kommen, dürfte der geringfügige Mehraufwand, der bei "Stringzahlen"-Vergleichen berücksichtigt werden muß, gegenüber dem Mehraufwand bei Fließkomma-Vergleichen kaum noch ins Gewicht fallen.

    Worin besteht denn der Mehraufwand? Dir muss nur bewusst sein, dass Du EEPVer nicht auf (un)gleich prüfen darfst.

    Daher: Zahlen im Gleitkommaformat (float,double,...) nie auf Gleichheit prüfen! Statt dessen Prüfung auf > oder < oder E-Bereich.

    Wenn Du das bei der Codierung berücksichtigst, ist es für mich kein Mehraufwand.

    Der Anlagenverbinder selbst wird dort mit der Version "7.0.0.1" angegeben, als Zusatzprogramm zu EEP ab Version "14.1.0". Diese Versionsbezeichnungen wären als Fließkommazahl nicht mehr darstellbar ...

    Richtig. Da EEPVer nur die Hauptversion und das Update liefert, ist das aber nicht relevant.

    Gruß Ingo

  • Hallo miteinander,

    ungeachtet, ob es sinnvoll ist oder nicht, die Unter- und Unter-Unter-Version von EEP zu kennen, hat sich in einigen Beiträgen gezeigt, dass die Versionsnummer im String-Format als wünschenswert angesehen wir. Bei meinem Beitrag #9 war mir leider nicht die Syntax präsent, die die format()-Funktion dazu veranlasst, führende Nullen auszugeben. Hier der entsprechende Nachtrag:

    Code
    v = string.format("%05.2f", EEPVer)

    Wäre EEPVer = 9.2 (keine Ahnung, ob es die gibt), dann hätte v den Wert "09.20", EEPVer = 14.1 ergäbe "14.10".

    • Die 5 vor dem Punkt definiert dabei die Gesamtlänge des Strings, inkl. Dezimalpunkt.
    • Die 0 davor sorgt dafür, dass der String am Anfang mit Nullen aufgefüllt wird, wenn der String kürzer als (im Beispiel) 5 Zeichen lang wäre.
    • Die 2 nach dem Punkt bewirkt, dass nach dem Punkt 2 Ziffern geliefert werden, so dass ggf. auch am Schluss mit Nullen aufgefüllt wird.

    Stellt sich die Frage: Wozu das? Damit wird auch der String-Vergleich möglich, weil "09.20" kleiner "14.10" ist - im Gegensatz zu "9.20", was alphabetisch (es werden Strings verglichen!) nach "14.10" kommt, also größer ist.

    Auf diese Weise ließe sich das "Problem" aus dem Ursprungsbeitrag #1 lösen. Was natürlich nach wie vor nicht geht, ist zum Beispiel 14.1.3, weil die Version nunmal als Fließkommazahl geführt wird, und eine solche nicht mehr als einen Dezimalpunkt zu bieten hat.

    Aber wie @Goetz und schlingo ja schon festgestellt haben, ist das zur Ermittlung der installierten Plug-ins, und damit dem zur Verfügung stehenden Lua-Umfang, eh irrelevant.

    Viele Grüße vom

    Trambahnfahrer

    Einmal editiert, zuletzt von Trambahnfahrer (25. Juni 2018 um 21:42) aus folgendem Grund: Vergessener Hinweis auf die Autoren vorhergehender Beiträge.

  • Ein Hallo in die Runde,

    ich habe es für mich so gelöst. Ich möchte wissen, ob der User mindestens EEP14.2 und Plugin2 besitzt oder eine Version ab EEP15 besitzt Das "Plugin2" muß der User aber selbst aktivieren, da es ja nicht abrufbar ist. Hier ein Beispiel aus einem Trafoskript.

    Code
    if (EEPVer > 14.2 and MTS_EEP14_Plugin2 == 1) or EEPVer > 15 then nc, Name_ZV = EEPRollingstockGetTrainName(MTS_Trafo.Name_RM_V[Trafo_Nr][MTS_Trafo.aktiv[Trafo_Nr]]) -- mit EEP14.2 Plugin2
    else Name_ZV = ("#"..MTS_Trafo.Name_RM_V[Trafo_Nr][MTS_Trafo.aktiv[Trafo_Nr]]) -- ohne EEP14.2 Plugin2
    end

    :aq_1:

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)

  • Man könnte auch nach einer der Funktionen abfragen die im Plugin eingeführt worden ist, ob diese "betreibsbereit" wäre.

    Viele Grüße,
    Damian Rutkowski

    Acer Aspire 5750G, Intel® Core™ i5-2430M 2.4GHz with Turbo Boost up to 3.0GHz, NVIDIA® GeForce® GT 540M, Up to 4095 MB TurboCache™, 8 GB DDR3 Memory, 8 GB DDR3 Memory
    EEP 6, EEP 16 mit allen Updates, Patches und Plug-Ins (stets aktuell gehalten)

  • Hallo Damian,

    warum ist mir das nicht eingefallen.........:as_1:, so einfach und ich zerbreche mir den Kopf mit Fließkommazahlen. :ma_1:

    Danke nochmals. :aq_1:Jetzt schnell die Skripte umschreiben.:ae_1:

    MfG. Jörg
    Ausstattung: Notebook: i7-6700K, 4[8]x4.0 GHz, 32GB RAM DDR4, NVIDIA GTX 980M 8GB, Windows 10, 64-Bit
    Installiert: EEP17.2 Plugin 1 + 2

    Zusatzprogramme: ResourcenSwitcher2 (BH2), EEP-Gleisplan (Frank Buchholz)