Lade...
 

CX_FORMULA - Konstante

Konstante

  • (dimensionslose) numerische Konstante sind entweder ganze oder reelle Zahlen, wobei - wie in allen Programmiersprachen - die Dezimalstellen mit Punkt vom ganzzahligen Anteil abgetrennt werden:  Beispiel 2.71828
  • bei dimensionierte numerische Konstanten folgt eine Maßeinheit, Beispiel 2.37cm Besteht die Maßeinheit aus einem Quotienten, so muss sie in eckige Klammern gesetzt werden:
    Beispiel
    2.5[cm/g]
    Da andernfalls die Maßeinheit im Nenner als Variable angesehen würde (in 2.5cm/g als Variable g, durch die zu dividieren ist).
    Einige Maßeinheiten haben in unterschiedlichen Sprachen verschiedene Namen; die dimensionsbehafteten Konstanten passen sich der aktuell eingestellten Sprache an.
  • Enumerationskonstanten werden aus dem Kontext im Formelausdruck erkannt, wenn sie durch einen Vergleichsoperator mit einem Datenfeld verbunden sind, für das im ClassiX®-System eine Enum-Transformationstabelle definiert ist, wie im Beispiel  bf = beidseitig (Das dynamische Datenfeld bf (Typ ENUMSHORT) ist mit einer Transformationstabelle verbunden).
    Kann eine Enumerationskonstante nicht implizit erkannt werden, muss explizit mit dem Namen das Datenfeldes auf die Übersetzungstabelle verwiesen werden: Foo() = bf::beidseitig - mit dem Scope-Operator :: wird der Name des Datenfelds vorangestellt. 
    Enumerations-Namen, die nicht der Syntax eines Bezeichners entsprechen, müssen gequotet werden: bf = "both sides".
    Die Namen einer Enumerationskonstante sind oft sprachabhängig. Deshalb werden die Formelausdrücke entsprechend der aktuell eingestellten Sprache modifiziert.
  • Implizit bekannte Konstanten sind:
    Name Wert Klasse
    pi π = 3.14159265 CX_NUMERIC
    e e = 2,71828182  CX_NUMERIC
    true 1 CX_BOOLEAN
    false 0 CX_BOOLEAN

Außerdem können die Namen der in InstantView® definierten Datentypen einschließlich aller im ClassiX®-System bekannten Klassen als numerische Konstante benutzt werden. Diese Werte werden z.B. im Zusammenhang mit den Funktionen type und inherited benötigt.

  • Zeichenketten werden in Quotes eingeschlossen: "dies ist eine Zeichenkette"
  • Bestimmte Konstanten erhält man durch Funktionen, denen als Parameter eine Zeichenkette übergeben wird:
    Funktion ergibt Objekt der Klasse Beispiele
    Date(...) CX_DATE Date("24.12.1900") Date("today")
    SpanDate(...) CX_SPAN_DATE SpanDate("3.1.1999 - 23.2.1999")
    Time(...) CX_TIME Time("12.00")  Time("now")
    BitPattern(...) CX_BIT_PATTERN BitPattern("1011011101")

 


 Einige weitere Beispiele:

Konstante Beispiele Beschreibung
Zahl 1, 4.738 Eine ganze bzw. reelle Zahl.
vordefinierte Konstanten π und e pi, e Die Zahlen  π = 3,14159265 und e = 2,71828182 sind vordefiniert.
Wahrheitswerte true, false Konstante Objekte der Klasse CX_BOOLEAN mit dem entsprechenden Wert 
Wert
2m, 3.5[€/kg], 0.1mV
Eine Wertangabe, wobei die Einheit dann in eckigen Klammern stehen muss, wenn Operatoren Bestandteil der Maßeinheit sind
Zeichenkette  "sie sagte: \"NEIN\"" Ein beliebiger Text.
Enumerationswert
(explizit)
ma::Stahl, 
ma::"Sympal verzinkt"
Enumerationskonstante mit explizitem Verweis auf den Enumerationsslot über den Scope-Operator.
Enumerationswert
(implizit)

if (ma = "Sympal verzinkt")
  ... 
ma != Stahl  &  x > 3.5V 

Die explizite Angabe des Enumerationsslots kann entfallen, wenn er auch aus dem Kontext hervorgeht. Das ist der Fall, wenn die Konstante über einen Operator mit dem Datenfeld verbunden ist.

Hinweis zu implizitem Enumerationskontext

Die implizite zuordnung zum Enumerationsslot funktioniert nur, wenn der Enumerationsslot der erste (linke) Operand des Operators ist und der Enumerationswert der (rechte) zweite. Sobald ein Enumerationswert oder ein anderer Slot gelesen wird, wird diese implizite Zuordnung aufgehoben. Dies lässt sich an folgenden Beispielen verdeutlichen:

Beispiel 1:

Der erste If-Ausdruck liefert bei der Auswertung einen Fehler, weil Stahl und Sympal nicht als Enumerationswerte erkannt werden, da die Implizite Bindung nur für die beiden Operanden des =-Operators aktiv ist. Das Problem lässt sich lösen, indem der Enumerationsslot explizit angegeben wird.

// Doesn't work! if (ma = Holz) Stahl else Sympal // Works! if (ma = Holz) ma::Stahl else ma::Sympal
Beispiel 2:

Im nachfolgenden Beispiel sieht man, dass die implizite Bindung bei der Zuweisung eines Enumerationsslots an eine lokale Variable für den nächsten Operator erhalten bleibt. Dies funktioniert jedoch nur, wenn zwischen der Zuweisung und dem Vergleich keine weiteren Anweisungen stehen, die andere Slots/Zugriffspfade referenzieren.

// Works ma = Holz // Also works local x; x := ma; x = Holz // But this doesn't local x; x := ma; has(txt); x = Holz // This works again local x; x := ma; has(txt); x = ma::Holz

 

Hinweis: Der Formelparser behandelt eine Enumerationskonstante, die keiner Enumeration zugeordnet werden kann, wie einen regulären Zugriffspfad, was dazu führt, dass solche Fehler erst bei der Formelauswertung auffallen. Aus diesem Grund sollte der implizite Enumerationskontext nur in sehr einfachen Konstrukten verwendet werden und im Zweifelsfall der Kontext über den ::-Operator explizit angegeben werden.