Typecast/de

From Second Life Wiki
Jump to: navigation, search

Um den Datentyp eines Wertes zu verändern muss ein sogenanntes Typecast durchgeführt werden (Typkonvertierung). Es gibt zwei Arten der Typkonvertierung: explizit und implizit. Explizite Typkonvertierung muss durch den Programmierer geschehen, während implizite Typkonvertierung durch den Compiler vorgenommen wird. LSL unterstützt implizite Typkonvertierung von String zu Key und Integer zu Float.

Unterstützte Typecasts
To
integer float string key list vector rotation
From integer x x x x
float x x x x
string x x x x x x x
key x x x
list x x
vector x x x
rotation x x x


Syntax: (Typ)Wert

Konvertiert Wert in Typ.

• Ausdruck Typ veränderlicher Typ
• Ausdruck Wert Ausdruck oder Konstante

Wenn Wert ein komplexer Ausdruck ist, kann es sinnvoll sein Klammern zu setzen: (Typ)(Wert)

Beispiele

<lsl> string a = "1.5"; float b = (float)a; integer c = (integer)a;

integer i; i = (integer) 1.23; // 1 i = (integer) -1.23; // -1 i = (integer) "0123"; // 123 i = (integer) "0x12A"; // 298 i = (integer) " -5 "; // -5; leading white space is ignored i = (integer) "105 degrees here, it is a nice day"; // 105; non-numeric text which follows numeric text is ignored i = (integer) "String with no numbers"; // 0

float f; f = (float) "6.2e1"; // 62.0 f = (float) " -16.2°C is seriously cold!"; // -16.2; (float)string also ignores leading whitespace and trailing non-numeric characters // "6.2e1", "6.2e+1", "6.2E1", "6.2E+1" are all equivalent. f = (float) "Nancy"; // any string beginning with "nan" (case insensitive) --

                      //   Mono only: NaN (not a number); LSO: causes a math error

f = (float) "infallible LSL!"; // any string beginning with "inf" (case insensitive) --

                                //   Mono only: Infinity; LSO: causes a math error

string s; s = (string) -PI; // "-3.141593" with precision set to 6 decimal places by zero padding or rounding s = (string) [1, 2.3, "a"]; // "12.300000a" again 6 decimal places, but ... s = (string) <1.0, 2.3, 4.56>; // "<1.00000, 2.30000, 4.56000>" .. now with precision set to 5 decimal places s = (string) <2, 4, 0.0, PI >; // "<2.00000, 4.00000, 0.00000, 3.14159>"

list l; l = (list) ""; // [""] l = (list) <1.0, 2.3, 4.56>; // ["<1.00000, 2.30000, 4.56000>"]

vector v; v = (vector) "<1.0, 2.3, 4.56>"; // <1.0, 2.3, 4.56> v = (vector) "<1.0, 2.3>"; // ZERO_VECTOR (Due to insufficient value)

rotation r; r = (rotation) "<1.0, 2.3, 4.56, 1.0>"; // <1.0, 2.3, 4.56, 1.0> r = (rotation) "<1.0, 2.3, 4.56>"; // ZERO_ROTATION (Due to insufficient value) </lsl>

Anwendung

<lsl>default {

   state_entry()
   {
       integer iUnixTime   = llGetUnixTime(); 
       string  sUnixTime   = (string)unixTime;
       string  sRegionTime = (string)llGetTimeOfDay();
       llSetObjectDesc(sUnixTime);
       llSetText(sRegionTime, <1.0, 0.0 ,0.0>, 1.0);
   }

}</lsl>

Anmerkungen

  • Der Compiler erlaubt explizites Typecasting auch an Stellen wo dies nicht unbedingt sinnvoll ist und nicht optimale Ergebnisse liefert. Nicht benötigte Typkonvertierung bläht den Code unnötig auf und verlangsamt dessen Ausführung.

Anmerkungen

  • Typkonvertierung von Float zu Integer entfernt bloß den Teil hinter dem Komma. Um zur nähesten Ganzzahl zu runden, verwenden Sie bitte llRound.
  • Um die Elemente einer Liste auszulesen, verwenden Sie bitte die llList2* Funktionen.