Verhalten des Stacks bei Operationen

Willkommen in der OMSI-WebDisk!
Als Gast kannst du nur Inhalte in deiner ausgewählten Sprache sehen. Registrierte Nutzer können die Sichtbarkeit anderer Sprachen in ihrem Kontrollzentrum aktivieren, weitere Infos hier.
Alle Themen sind in den Foren mit einer Sprachflagge gekennzeichnet: = Englisch [EN], = Deutsch [DE], = Französisch [FR]. Wenn du die angegebene Sprache nicht beherrschst, schreibe auf Englisch!
  • Hallo,

    da ich den OMSI Script Creator entwickle, brauche ich einige Informationen zum Verhalten der Stacks:


    Danke für eure Antworten!

    • Wie genau wird der Wert mit "!" invertiert? Wird aus "0" eine "1" und aus "1" eine "0"?

    Der Wert wird einfach umgekehrt. Heisst:

    0 -> 1 -> 0


    Ist Variable1 = 1 wird sie zu 0

    Ist Variable1 = 0 wird sie zur 1

  • Es wird ja nur ein True oder ein False zurückgegeben, um die Bedingung auszuführen. Die Variable wird nur getauscht, wenn ich diese auch in sich selber Speichere.


    (L.L.variable1) ! (S.L.variable1)

  • Im Falle von IF-Schleifen:

    (L.L.variable) - wenn man nichts dahinter schreibt, interpretiert OMSI es als "(L.L.variable) 1 =". Die Variable muss 1 betragen, damit die IF-Schleife ausgeführt wird


    (L.L.variable) ! - wird als "(L.L.variable) 0 =" interpretiert. Die Variable muss also 0 sein


    (L.L.variable) 5 = - die Variable muss 5 betragen


    (L.L.variable) 5 = ! - die Variable muss einen anderen Wert als 5 betragen

  • "(L.L.variable) 1 =". Die Variable muss 1 betragen, damit die IF-Schleife ausgeführt wird

    Muss die Zwangsläufig 1 sein? Es reicht ein true, also alles größer als 0 ist oder täusche ich mich da jetzt?

  • Chrizzly92


    Weisst du was über diesen Punkt?


    Werden die Operanden bzw. der Operand bei allen mathematischen Operationen und Stringoperationen (siehe Wiki-Eintrag Scriptsystem) aus dem jeweiligen Stack gelöscht oder ist dies nur so bei "+", "-", "*", "/"?


    Bei sowas bin ich raus :S

  • In Ihrem Funktionsweise gibt es keinen Unterschied. die Operanden stehen faktisch nie im Stack, denn mit dem Operand werden ja die ersten beiden (oder die letzten beiden? Je nachdem wie man das sehen will :D) Werte verarbeitet . die beiden alten Werte werden aus dem Stack entfernt und der neue Wert wird reingeschrieben. Im Grunde prüft ein "&&" ja auch nur, ob beide Werte größer Null sind und wenn ja, schreibt er eine "1" als Ergebnis in den Stack.

  • Vielen Dank für die Antworten!

    Ich fasse mal zusammen, um sicherzugehen, dass ich alles richtig verstanden habe:

    • Im Fall von (L.L.variable1) ! (S.L.variable1) wird die Variable zu 1 bzw. zu 0, es kommt darauf an, ob die Variable 0 oder 1 ist.
      Wenn die Variable aber bspw. 18 (also größer 0, True) ist, wird sie auch zu 0?
    • Bei der If-Anweisung: (L.L.variable) ! {if} ... muss die Variable alles andere als ihr Wert sein.
    • Bei jeglichen Operationen werden die Operanden aus dem Stack entfernt. Also wird der Wert 5 auch bei bspw. 5 random entfernt.
    • True ist alles, was größer als 0 ist.

    Langsam frage ich mich, wie die auf sowas gekommen sind 😂...

    • Im Fall von (L.L.variable1) ! (S.L.variable1) wird die Variable zu 1 bzw. zu 0, es kommt darauf an, ob die Variable 0 oder 1 ist.
      Wenn die Variable aber bspw. 18 (also größer 0, True) ist, wird sie auch zu 0?

    Exakt. OMSI interpretiert alles außer 0 als "true"; invertierst du also 18, wird null draus; bei einem erneuten Invertieren dann zu 1.


    • Bei der If-Anweisung: (L.L.variable) ! {if} ... muss die Variable alles andere als ihr Wert sein.

    Könnte man so formulieren. Im Grunde wird aus einer 0 eine 1 bzw. aus jedem Wert eine Null.


    • Bei jeglichen Operationen werden die Operanden aus dem Stack entfernt. Also wird der Wert 5 auch bei bspw. 5 random entfernt.
    • True ist alles, was größer als 0 ist.

    True ist auch, was kleiner als 0 ist. Nur die Null selbst wird als "false" interpretiert.


    soweit wie ich das Verstehe, liegt der Vorteil bei diesem Scriptsystem und der umgekehrten polnischen Notation darin, dass das Script Wie ein Buch "gelesen" werden kann. es gibt ja deshalb auch keine Sprünge oder Loops innerhalb eines Frames. Stacks oder Register gibts in anderen Sprachen auch, die eine ähnliche Funktion haben.

  • soweit wie ich das Verstehe, liegt der Vorteil bei diesem Scriptsystem und der umgekehrten polnischen Notation darin, dass das Script Wie ein Buch "gelesen" werden kann. es gibt ja deshalb auch keine Sprünge oder Loops innerhalb eines Frames. Stacks oder Register gibts in anderen Sprachen auch, die eine ähnliche Funktion haben.

    Ja, das stimmt. Erleichtert mir die Arbeit erheblich.

    Hier noch ein paar Fragen:

    • achtet && auf TRUE und FALSE (Bsp.: 18 5 && wäre 1) oder ob die Werte wirklich identisch sind (Bsp.: 18 5 wäre 0)
    • Werden auch bei den Vergleichsoperatoren die beiden miteinander verglichenen Werte gelöscht? Ich meine nein, möchte aber sichergehen ...
    • Wie genau funktioniert $IntToStrEnh? Ich kann das leider aus dem Wiki-Artikel nicht ganz verstehen ... Was sind die Parameter und was der Output?
    • Was passiert bei arctan und arcsin, wenn das Ergebnis nicht möglich/unendlich ist?
    • achtet && auf TRUE und FALSE (Bsp.: 18 5 && wäre 1) oder ob die Werte wirklich identisch sind (Bsp.: 18 5 wäre 0)


    (L.L.ABC) 10 =

    (L.L.DEF) 5 = &&

    {if}



    würde also nur ausgeführt werden, Wenn ABC "10" ist und DEF "5" ist.

    Da OMSI alles als true interpretiert, was nicht Null ist, wäre also 18 5 && immer true, also 1, 18 0 && wäre aber false, also 0.


    • Werden auch bei den Vergleichsoperatoren die beiden miteinander verglichenen Werte gelöscht? Ich meine nein, möchte aber sichergehen ...



    Bei Vergleichsoperatoren werden, soweit ich das Verstanden habe, auch die beiden Stackwerte gelöscht. Das verhält sich genauso wie eine Addition - nur dass anstatt dem Ergebnis halt eine "0" oder eine "1" in den Stack geschrieben wird.



    • Wie genau funktioniert $IntToStrEnh? Ich kann das leider aus dem Wiki-Artikel nicht ganz verstehen ... Was sind die Parameter und was der Output?


    $IntTostrEnh ist quasi dafür da, Ein bestimmtes Format zu bestimmen. Nehmen wir mal an, ich möchte Einen String anzeigen, welcher Immer 2 Zeichen hat - bei einer Digitaluhr beispielsweise.


    Diese zeigt bei Null Uhr "00:00" an; hätte ich jetzt aber eine Variable Für die Stunde und Minute, welche beide "0" als Wert haben und ich diese als Werte verwenden möchte, könnte ich diese mit $IntToStr Umwandeln und mit einem Doppelpunkt verbinden.


    (L.$.Stunde) $IntToStr ":" $+ (L.$.Minute) $+ Ergibt nun aber nicht "00:00" sondern "0:0" - was aber nicht korrekt wäre.


    Mit $IntToStrEnh kann man den String entsprechend Manipulieren und "auffüllen". (L.L.Stunde) "02" $IntToStrEnh würde den String quasi auf 2 Stellen mit Nullen auffüllen, also aus "0" würde es "00" machen. Wäre die Variable 2-Stellig, wäre "02" $IntToStrEnh das gleiche wie $IntToStr, Wäre die Variable 3-Stellig, würde $IntToStrEnh anstatt der umgewandelten Variable "Error" ausgeben.


    Gäbe es eine fiktive 3-Stellige Uhr, welche das Format "000:000" anzeigt, würde man $IntToStrEnh folgenderweise nutzen:


    (L.L.BlockA) "03" $IntToStrEnh ":" $+ (L.L.BlockB) "03" $IntToStrEnh $+ (S.$.3_stellige_uhr)


    Das erste Zeichen innerhalb der Gänsefüßchen ist das Zeichen, mit dem die fehlenden Stellen aufgefüllt werden, das zweite Zeichen in den Gänsefüßchen ist die Länge des Strings.


    • Was passiert bei arctan und arcsin, wenn das Ergebnis nicht möglich/unendlich ist?


    das kann ich dir nicht beantworten, ist in der Regel aber auch nicht relevant. da es sich um eine 32-Bit Anwendung handelt, wäre vermutlich spätestens bei -2.147.483.648 bzw. bei 2.147.483.647 Schluss.