Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 160

 
Alexey Viktorov:

NULL ist eine derartige Zweideutigkeit, dass man vorsichtig damit umgehen muss.

void OnStart()
{
  uchar Bytes[];

  Print(StringToCharArray(NULL, Bytes)); // 0
  Print(StringToCharArray("", Bytes));   // 1
}

Noch einmal, eine Eingabezeichenkette kann nicht NULL sein (erzwungen durch ""). Die anderen Saiten können.

 
fxsaber:

Auch hier darf die Eingabezeichenfolge nicht NULL sein (erzwungen durch ""). Die anderen Saiten können.

input ist fast ein Synonym für const, const muss initialisiert werden
 
fxsaber:

Auch hier darf die Eingabezeichenfolge nicht NULL sein (erzwungen durch ""). Die anderen Saiten können.

Noch einmal: Warum sollte es Ihrer Meinung nach keine solche Umstellung geben? Mein Wissen und meine Erfahrung reichen nicht aus, um dies alles zu erklären. Bleiben Sie also bei Ihrer Meinung. Ich hoffe, dass die Entwickler nicht mitmachen und es ändern.

 
Alexey Viktorov:

Noch einmal: Warum sollte es Ihrer Meinung nach keine solche Umstellung geben?

Ich weiß genau, warum diese Umstellung erfolgt. Wir sprechen hier von einer Funktion, nicht von einem Fehler.

 
Maxim Kuznetsov:
input ist fast synonym mit const, const muss initialisiert werden

NULL ist eine Initialisierung. Das Beispiel zeigt absichtlich eine nicht eingegebene Zeichenfolge.

 
fxsaber:
Es ist ratsam, bei der Kompilierung eine Warnung zu erzeugen.

Ja, dieses Verhalten ist wahrscheinlich einfach "narrensicher".
Da eine Eingangsvariable initialisiert werden muss, wird= NULL künstlich mit ="" gleichgesetzt, wenn die Variable bereits mindestens ein Byte im Speicher belegt.

In MQL5 die Einträge:

string str=NULL;
string str;

sind absolut identisch. Für die Variable wird kein Speicher zugewiesen. Jedenfalls habe ich keine Unterschiede festgestellt.
In Java zum Beispiel sind solche Datensätze leicht unterschiedlich, obwohl in beiden Fällen kein Speicher für die Variable zugewiesen wird. Die erste Variante (String str = null;) wird als initialisiert betrachtet, obwohl kein Speicher für die Variable zugewiesen wird und die Variable als leer ausgegeben werden kann. Im zweiten Fall (String str;) wird beim Versuch, die Variable zu drucken, ein Fehler wegen einer nicht initialisierten Variable erzeugt.
D.h. MQL5 ist in dieser Hinsicht toleranter.
Was besser ist, weiß ich nicht einmal.

 
Nikolai Semko:

Da eine Eingangsvariable initialisiert werden muss, wird das= NULL künstlich mit ="" gleichgesetzt , obwohl die Variable bereits mindestens ein Byte im Speicher belegt.

NULL ist keine Initialisierung, es ist ein Wert. Sie können jeder Nicht-Konst-String-Variablen mitten im Code NULL zuweisen. Und es wird gleich NULL sein.

Input ist nicht gleich NULL, da beim Start eine unsichtbare Set-Datei erstellt wird. Aus dieser Datei werden die Variablenwerte in Eingaben "geparst". Das Parsing kann ohnehin nicht NULL ausgeben und setzt daher eine leere Zeichenkette an diese Stelle.

Nur input-string hat dieses Verhalten. Für const-string und andere ist es natürlich in Ordnung.
 
fxsaber:

NULL ist keine Initialisierung, sondern ein Wert. Sie können eine beliebige nicht-konstante String-Variable in der Mitte des Codes auf NULL setzen. Und es wird gleich NULL sein.

Input ist nicht gleich NULL, da beim Start eine unsichtbare Set-Datei erstellt wird. Aus dieser Datei werden die Variablenwerte in Eingaben "geparst". Beim Parsen wird NULL überhaupt nicht ausgegeben und daher eine leere Zeichenkette dort platziert.

Das ist es, was ich meine. Ich stimme zu.
Das einzige Problem ist, dass es keinen Sinn macht, einer Zeichenkette in der Phase der Variablendeklaration einen NULL-Wert zuzuweisen:

string str1 = NULL;
string str2;
PRINT((str1==NULL));   // true
PRINT((str2==NULL));   // true

Es ist nur sinnvoll, dies zu tun, um die bereits initialisierte Variable im Speicher auf Null zu setzen.

 
Nikolai Semko:

Nun, das ist es, was ich sage. Ich stimme zu.
Das einzige Problem ist, dass es keinen Sinn macht, einer Zeichenkette in der Phase der Variablendeklaration einen NULL-Wert zuzuweisen:

Dies ist nur sinnvoll, um eine Variable im Speicher zu löschen.

#define  DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

Hier ist die NULL-Initialisierung sinnvoll.

 
fxsaber:

Die NULL-Initialisierung ist hier sinnvoll.

ja

Grund der Beschwerde: