- Ganzzahlige Typen
- Realtypen (double, float)
- Komplexen Zahlen (complex)
- Typ string
- Strukturen, Klassen und Schnittstellen
- Objekt des dynamischen Arrays
- Matrizen und Vektoren
- Typenreduzierung
- Typ void und Konstante NULL
- Benutzerdefinierte Typen
- Objektanzeiger
- Referenzen. Modifikator& und Schluesselwort this
Typenreduzierung
Reduzierung der Zahlentypen
Oft muss man einen Zahlentyp in den anderen umwandeln. Nicht jeden numerischen Typ kann man in einen anderen umwandeln, zulaessige Reduzierungen in MQL5 werden auf dem Schema gezeigt:
Volllinien mit Richtungszeichen bezeichnen Umwandlungen, die ohne Informationsverlust durchgeführt werden. Anstatt des Typs char kann der Typ bool auftreten(die beiden nehmen 1 Byte des Speicherplatzes ein), anstatt des Typs int kann der Typ color verwendet werden (jeder 4 Byte), anstatt des Typs long ist der Typ datetime zulaessig (jeder 8 Byte). Vier graue Strichlinien auch mit Richtungszeichen bezeichnen Umwandlungen, bei denen der Genauigkeitsverlust entstehen kann. ZB. Zifferzahl in der Ganzzahl 123456789 (int) ist mehr als es vom Typ float vertreten werden kann.
int n=123456789;
|
Die Zahl, die in Typ float umgewandelt ist, hat dieselbe Ordnung, aber kleinere Genauigkeit. Die den schwarzen Richtungszeichen entgegengesetzte Umwandlungen können mit Informationsverlust durchgeführt werden. Umwandlungen unter char und uchar, short und ushort, int und uint, long und ulong (gemeint werden gegenseitige Umwandlungen), können zum Informationsverlust führen.
Im Ergebnis der Reduzierung des Fliesspunktwertes zum Bruchwert wird der Bruchteil immer weggelassen. Wen man Fliesspunktzahl zur naechstliegenden Ganzzahl runden muss ( in den meisten Faellen ist es nuetzlicher), muss man die Funktion MathRound() verwenden.
Beispiel:
//--- Fallbeschleunigung
|
Wenn zwei Werte durch Binaeroperator verbunden werden, wird der Operand des jungeren Typ in den Operand des aelteren Typs umgewandelt laut Prioritaet dezeigt auf dem Schema:
Datentypen char, uchar, short und ushort werden zum Typ int reduziert.
Beispiele:
char c1=3;
|
Berechnetre Ausdruck besteht aus zwei Operationen. Im ersten Beispiel wird die Variable vom ersten Typ char in die zeitweilige Variable des Typs int umgewandelt, denn der zweite Operand in Division, Konstante 2, hat einen aelteren Typ int. Im Ergebnis der ganzzahliger Division 3/2 wird der Wert 1, den der Typ int hat.
In zweiter Operation des ersten Beispiels tritt als zweiter Operand Konstante 0.3 auf, die zum Typ double gehört, darum wird das Ergebnis nach der ersten Operation in die zeitweilige Variable des Typs double mit dem Wert 1.0 umgewandelt.
Im zweiten Beispiel wird die Variable vom ersten Typ char in die zitweilige Variable des Typs double umgewandelt, denn der zweite Operand in Division, Konstante 2.0 gehört zum Typ double; weitere Umwandlungen werden nicht durchgeführt.
Reduzierung der Zahlentypen
In Ausdrücken der Sprache MQL5 kann explizite und implizite Typenreduzierung verwendet werden. Explizite Typenreduzierung wird auf der Weise geschrieben:
var_1 = (Typ)var_2; |
Als Variable var_2 kann Ausdruck oder Ergebnis der Funktion sein. Zulaessig ist auch Funktionsaufschreibung der expliziten Typenreduzierung:
var_1 = Typ(var_2); |
Betrachten wir explizite Reduzierung am ersten Beispiel:
//--- drittes Beispiel
|
Vor Division wird die Variable c1 explizit in den Typ double umgewandelt. Die derzeit ganzzahlige Konstante 2 wird zum Wert 2.0 des Typs double reduziert, denn während der Umwandlungen bekam der erste Operand den Typ double. Tatsaechlich ist die explizite Typenumwandlung einstellige Operation.
Außerdem kann das Ergebnis bei der Typenreduzierung ausserhalb der zulaessigen Stellenzahl sein. In diesem Fall entsteht Abbruch. ZB.:
char c;
|
Vor den Operationen ( ausser Zuordungsoperationen) wird die Umwandlung in den Typ durchgeführt, der die groesste Prioriraet hat, und vor den Zuordnungsoperationen - in den Zieltyp.
Beispiele:
int i=1/2; // keine Typenreduzierung, Ergebnis: 0
|
Wenn Sie Typ long/ulong in double konvertieren, kann Genauigkeit verloren gehen: wenn das Ganze ist größer als 9223372036854774784 oder kleiner als -9223372036854774784.
void OnStart()
|
Reduzierung für Typ string
Typ string hat die hoechste Prioritaet unter einfachen Typen. Darum wenn einer der Operanden den Typ string hat, wird der andere operand zum Typ string authomatisch reduziert. Man muss in Vormerkung behalten, dass es für den Typ string nur einzige zweistellige Operation zulaessig ist. Explizite Reduzierung der Variable des Typs string zum jeden Zahlentyp ist zulaessig.
Beispiele:
string s1=1.0/8; // Ausdruck wird zum Typ double reduziert,
|
Reduzierung der Typen von Anzeigern der Basisklassen zu Anzeigern der sekundaeren Klassen
Objekte der sekundaeren Klasse können auch als Objekte der ihr entsprechenden Basisklasse betrachtet werden. Das führt zu einigen interessanten Folgen. ZB. Gegen die Tatsache, dass Objekte verschiedener Klassen, die von einer Basisklasse entstanden, können sich voneinander unterscheiden, können wir Ihre verbundene Liste erzeugen (List), denn wir betrachten sie als Objekte der Basisklasse. Aber das Gegenteil stimmt nicht: Objekte der Basisklasse sind nicht automatisch Objekte der sekundaeren Klasse.
Man kann explizite Typenreduzierung verwenden, um die Anzeiger der Basisklasse in die Anzeiger der sekundaeren Klasse umwandeln. Man muss aber ganz sicher sein, dass diese Umwandlung zulaessig ist, sonst entsteht ein kritischer Fehler der Ausführungszeit und das mql5-Programm wird gestoppt.
Dynamische Typumwandlung mithilfe von dynamic_cast #
Es besteht die Möglichkeit einer dynamischen Typumwandlung mithilfe der Anweisung dynamic_cast, die nur an Pointer von Klassen angewendet werden kann. Dabei wird die Korrektheit von Typen während der Ausführung des Programms überprüft. Dies bedeutet, der Compiler überprüft nicht den Datentyp für die Umwandlung, wenn dynamic_cast verwendet wird. Wenn der Pointer in den Typ umgewandelt wird, der kein tatsächlicher Objekttyp ist, hat das Ergebnis den Wert NULL.
dynamic_cast <type-id> ( expression ) |
Der Parameter type-id in spitzen Klammern muss Pointer auf einen früher definierten Typ der Klasse sein. Der expression Operand kann von jedem Typ sein (im Vergleich zu C++) außer void.
Beispiel:
class CBar { };
|
Sehen Sie auch