Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 161

 
printf("%s , %f , %i",(string)NULL,(double)NULL,(int)NULL);

2020.01.27 01:15:57.859 tst (EURUSD,H1) (null) , 0.000000 , 0

wenn ich die Typkonvertierung entferne, ist der Ausdruck "NULL" vom Typ "void" illegal

Interessanterweise stellt sich heraus, dass nput string als void initialisiert werden kann

 
fxsaber:

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

NULL / NIL (in anderen Worten) kann keine Initialisierung einer konstanten String-Entität sein.

Zumindest weil der mql-String kein "Zeiger" wie in C ist. Es hat keinen besonderen Zustand "gar nichts".

PS (oh, das hätte ich von mir selbst nicht erwartet)

 
Maxim Kuznetsov:

Sie hat keinen besonderen Zustand von "gar nichts".

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

fxsaber, 2020.01.26 15:54

void OnStart()
{
  uchar Bytes[];

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

Ich benutze diesen Zustand jeden Tag.

 
Maxim Kuznetsov:

zumindest weil ein mql-String kein "Zeiger" wie in C ist. Es hat keinen besonderen Zustand "gar nichts".

PS (oh, das hätte ich von mir selbst nicht erwartet).

leider nein, ein String in MQL ist eine Entität mit zugewiesenem Speicher.@Ilyas hat erklärt, warum StringBufferLen() nicht die Stringlänge anzeigt, sondern den zum Speichern des Strings verwendeten Speicher.


fxsaber:

Ich benutze diesen Zustand jeden Tag.

Es ist kein Indikator überhaupt, in MQL4 ich unset Zeiger auf jedes Objekt mit StringConcatenate(), d.h. die eingebauten Funktionen arbeiten nicht durch MQL-Regeln implementiert )))

input string s = NULL;
void OnStart()
{
   uchar Bytes[];
  Print(StringToCharArray(NULL, Bytes));  // 0
  Print(StringToCharArray("", Bytes));    // 1
  Print(StringToCharArray(s, Bytes));     // 1
}
 
Igor Makanu:

Es ist kein Indikator überhaupt, ich unset Zeiger auf jedes Objekt in MQL4 mit StringConcatenate(), d.h. die eingebauten Funktionen sind nicht durch MQL-Regeln implementiert )))

Es macht keinen Unterschied, was drin ist.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Eigenheiten von mql5, Tipps und Tricks

Igor Makanu, 2020.01.26 22:27

input string s = NULL;
void OnStart()
{
   uchar Bytes[];

  Print(StringToCharArray(s, Bytes));     // 1
}
Weil es nicht NULL ist. Genau darum ging es in der ursprünglichen Nachricht.
 
fxsaber:

Es macht keinen Unterschied, wie es innen aussieht.

ergänzte meinen Beitrag mit Ihrem Beispiel


Ich habe auch ein paar weitere Experimente mit der Eingabe s = NULL durchgeführt;

Soweit ich es verstanden habe, wird der Wert der Eingangsvariablen NULL sein, solange wir nicht versuchen, ihn zu verwenden, aber in dem Moment, in dem wir versuchen, einer anderen Variablen einen Wert zuzuweisen oder sie einfach zu löschen, wird NULL verschwinden, d.h. dieser Eingangsvariablen wird Speicher zugewiesen

 
Igor Makanu:

Soweit ich das verstehe, ist dieser Wert NULL, solange wir nicht versuchen, den Wert einer Eingangsvariablen zu verwenden. Wenn wir aber in diesem Moment versuchen, den Wert dieser Eingangsvariablen einer anderen Variablen zuzuweisen oder diese Eingangsvariable einfach zu löschen, dann verschwindet dieser NULL-Wert, d.h. dieser Eingangsvariablen wird Speicher zugewiesen

Die Funktionsweise der Eingangsvariablen wurde oben bereits ausführlich beschrieben.

 
fxsaber:

Es macht keinen Unterschied, was drin ist.

Weil es nicht NULL ist. Genau darum ging es in der ursprünglichen Nachricht.

es gibt (noch) eine Spezifität der Dereferenzierung von Entitäten (es gibt keine Zeiger in Mql, es ist nicht C, es soll Entitäten geben)

input ist eine Konstante, die beim Start deklariert wird. Sie können ihr nicht physisch den Wert "NULL" geben.

const string nothing=NULL; /// <--- ЭТО ЧТО ?

 
Nikolai Semko:

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

In MQL5 die Einträge:

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.

Wie wird einer Variablen kein Speicher zugewiesen?
Der Speicher wird zugewiesen, und die Variable enthält willkürlichen Unsinn.
Und da string keine Werte ausgibt, ist es logisch, dass der Puffer leer ist.

char   ch; 
short  sh;
int    in;
double db;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(in));
Print(sizeof(db));
Print(sizeof(st));
Print("---------------------");
Print(ch);
Print(sh);
Print(in);
Print(db);
Print(st);
 
Roman:

Wie wird einer Variablen kein Speicher zugewiesen?
Der Speicher wird zugewiesen, aber die Variable enthält keinen willkürlichen Unsinn.
Und da string keine Werte ausgibt, ist es logisch, dass der Puffer leer ist.

char ch; 
short sh;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(st));

   string str1;
   string str2="Однажды, в студёную зимнюю пору я из лесу вышел; был сильный мороз.";
   Print(sizeof(str1));  // 12
   Print(sizeof(str2));  // 12
   uchar ch1[],ch2[];
   Print(StringToCharArray(str1, ch1));  // 0
   Print(StringToCharArray(str2, ch2));  // 68