Die neue MQL4-Syntax - Seite 3

 

Ich habe eine Frage zu den Variablentypen, int, uint, char, short ushort usw. Der neue Compiler warnt vor möglichen Datenverlusten aufgrund von Typkonvertierungen. Ist es also die beste Praxis,;

a) den Typ zu verwenden, der am besten zu den Anforderungen der Variablen passt, oder,

b) die Konvertierung zwischen Typen zu vermeiden und daher int für alles zu verwenden. (naja, alles, was keine Fließkommazahl braucht)

 
SDC:

Ich habe eine Frage zu den Variablentypen, int, uint, char, short ushort usw., ist es die beste Praxis;

a) den Typ zu verwenden, der am besten zu den Anforderungen der Variablen passt, oder

b) eine Konvertierung zwischen den Typen zu vermeiden und daher int für alles zu verwenden. (naja, alles, was keine Fließkommazahl benötigt)

Wenn Sie einen Long ohne Vorzeichen benötigen, reicht ein int nicht aus ... verwenden Sie den richtigen Typ und eine explizite Typkonvertierung. IMO
 

Mit expliziter Typkonvertierung meinen Sie, dass die Konvertierung vor allen Berechnungen zwischen verschiedenen Typen durchgeführt werden soll?

 
RaptorUK:
Wenn Sie einen unsigned long benötigen, reicht ein int nicht aus ... verwenden Sie den richtigen Typ und eine explizite Typkonvertierung. IMO

Einverstanden.
 
SDC:

Mit expliziter Typkonvertierung meinen Sie, dass die Konvertierung vor allen Berechnungen zwischen verschiedenen Typen durchgeführt werden soll?

Siehe hier: https: //www.mql5.com/en/docs/basis/types/casting
 

Guter Artikel, danke angevoyageur, ich werde ihn genau lesen, wenn ich von der Arbeit nach Hause komme.

 
SDC:

Mit expliziter Typkonvertierung meinen Sie, dass die Konvertierung vor allen Berechnungen zwischen verschiedenen Typen erfolgen muss?

Nein, ich meine, dass man einen ulong in einen int umwandeln kann...

ulong VariableUlong;

int VariableInt;

VariableUlong = 100;

VariableInt = (int) VariableUlong;   // explicit typecasting . . .  
 

OK ja, das ist, was ich dachte, dass Sie gemeint haben.

Außer I wasnt wirklich fragen über ulong. Ich würde selten, wenn überhaupt, mit so großen Werten arbeiten müssen, die nicht von einer 32-Bit-Ganzzahl untergebracht werden können. Ich weiß nicht einmal, wie man die Anzahl der 64-Bit-Integer halten kann lol...

Ich hätte wahrscheinlich spezifischer sein sollen, ich hatte heute morgen keine Zeit, meine Frage richtig zu formulieren, aber jetzt, wo ich zu Hause bin, werde ich das tun.

Im alten mql4 haben wir Integer für alles verwendet. Wir würden for(int i=0; i<100; i++) schreiben. Wir brauchen keine negativen Werte, und wir brauchen keinen größeren Wert als 100, also könnten wir einen uchar dafür verwenden. Heißt das, dass wir das so machen sollten?

Wenn ich mir den Code anderer Programmierer ansehe, scheinen viele von ihnen durchgängig 32-Bit-Integer-Typen zu verwenden. Gibt es dafür einen triftigen Grund? Was wissen sie, was ich noch nicht herausgefunden habe? Führt die Verwendung der kleinstmöglichen Variablentypen im gesamten Programm zu Problemen mit der Typisierung, ohne dass es dafür einen anderen Grund gibt als eine etwas geringere Dateigröße? Oder spart es eine Menge RAM? Kann man davon ausgehen, dass es in Ordnung ist, den Wert eines Typs in einen anderen Typ zu übertragen, solange er dort untergebracht werden kann? Verbraucht das Typecasting zwischen verschiedenen Typen viel mehr CPU, als wenn man denselben Typ verwendet?

Update: Ich habe das nachgeschlagen und diese Antwort auf eine ähnliche Frage auf stackoverflow.com gelesen

"Von der Leistung her ist ein int in fast allen Fällen schneller. Die CPU ist darauf ausgelegt, effizient mit 32-Bit-Werten zu arbeiten.

Kürzere Werte sind komplizierter zu handhaben. Um z.B. ein einzelnes Byte zu lesen, muss die CPU den 32-Bit-Block lesen, der es enthält, und dann die oberen 24 Bits ausblenden.

Um ein Byte zu schreiben, muss sie den 32-Bit-Zielblock lesen, die unteren 8 Bits mit dem gewünschten Byte-Wert überschreiben und den gesamten 32-Bit-Block wieder zurückschreiben.

Durch die Verwendung kleinerer Datentypen lassen sich natürlich ein paar Bytes einsparen. Wenn Sie also eine Tabelle mit ein paar Millionen Zeilen erstellen, sind kürzere Datentypen vielleicht eine Überlegung wert. (Und das Gleiche könnte ein guter Grund sein, warum Sie kleinere Datentypen in Ihrer Datenbank verwenden sollten)

Und was die Korrektheit betrifft, so läuft ein int nicht so leicht über. Was ist, wenn Sie denken, dass Ihr Wert in ein Byte passt, und dann irgendwann in der Zukunft eine harmlos aussehende Änderung am Code bedeutet, dass größere Werte darin gespeichert werden?

Das sind einige der Gründe, warum int Ihr Standarddatentyp für alle ganzzahligen Daten sein sollte. Verwenden Sie byte nur, wenn Sie tatsächlich Maschinenbytes speichern wollen. Verwenden Sie shorts nur, wenn Sie es mit einem Dateiformat oder Protokoll oder Ähnlichem zu tun haben, das tatsächlich 16-Bit-Integer-Werte vorschreibt. Wenn Sie nur mit Ganzzahlen im Allgemeinen zu tun haben, machen Sie sie zu Ints.

 
SDC:

OK ja, das ist, was ich dachte, dass Sie gemeint haben.

Außer I wasnt wirklich fragen über ulong. Ich würde selten, wenn überhaupt, mit so großen Werten arbeiten müssen, die nicht von einer 32-Bit-Ganzzahl untergebracht werden können. Ich weiß nicht einmal, wie man die Anzahl der 64-Bit-Integer halten kann lol...

Wahrscheinlich hätte ich mich genauer ausdrücken sollen, ich hatte heute morgen keine Zeit, meine Frage richtig zu formulieren, aber jetzt, wo ich zu Hause bin, werde ich das tun.

Im alten mql4 haben wir Integer für alles verwendet. Wir würden for(int i=0; i<100; i++) schreiben. Wir brauchen keine negativen Werte, und wir brauchen keinen größeren Wert als 100, also könnten wir einen uchar dafür verwenden. Heißt das, dass wir das so machen sollten?

uchar - Unsigned Character, warum sollten Sie das für eine Schleife verwenden? das macht für mich keinen Sinn ... verwenden Sie einen int. Du wirst mit ulongs arbeiten, das ist eine neue datetime ... und wenn du in Zukunft Typecasts machst, ohne darüber nachzudenken, wirst du gewarnt werden ... gehe mit der Warnung um oder ignoriere sie. Hoffen Sie nicht nur auf das Beste, sondern machen Sie es wie jetzt, lernen und verstehen Sie.

Das, was Sie auf Stackoverflow gepostet haben, macht für mich Sinn, ich denke, es ist ein guter Rat.

 
SDC: Verbraucht das Typecasting zwischen verschiedenen Typen viel mehr CPU, als wenn man denselben Typ verwendet?

Zwischen verschiedenen Größen wird mehr CPU verbraucht, nicht viel mehr. Es sind nur unterschiedliche Anweisungen wie die erwähnten 32-Bit-Fetch-, Isolate-, Operate-, Place- und Write-Anweisungen, wenn ein Zeichen in einer Struktur verändert wird. So wie das Multiplizieren mit 0,5 etwas weniger CPU verbraucht als das Dividieren durch 2,0

16 Bits pro Array-Element zu speichern macht auf GB-Maschinen keinen Sinn, das habe ich gemacht, als ich Anwendung, Datenbank und GUI (vt100) in 8 KB (sic.) implementiert habe. Zu 64 Bits pro (für alles) zu gehen, macht erst Sinn, wenn 128-Bit-Plattformen üblich sind.

Vorzeichenbehaftet vs. vorzeichenlos gibt es keinen Unterschied. Es handelt sich nur um eine Zuweisung, es werden keine Bits verändert. Der Unterschied ist der Code, der die Variable verwendet. Z.B. A[index] macht Address(a) + index * sizeof(a[0]), wobei das Plus eine Addition mit oder ohne Vorzeichen ist.

Für die Klarheit der Codierung würde ich uint für die Indizierung von Arrays verwenden, da A[-1] keinen Sinn macht, aber dann ist das Abwärtszählen problematisch FOR(uint iA=n; iA >= 0; iA--){} iA>=0 ist immer wahr.

Verwenden Sie int (oder uint), es sei denn, Sie müssen dies aus anderen Gründen tun.
Grund der Beschwerde: