Fragen von einem "Dummy" - Seite 123

 
papaklass:

MqlRates mrate[];//массив нулевого размера

Verwenden Sie ArrayResize und ArrayInitialize.

Normalerweise wird diese Struktur bei CopyRates verwendet.

 
papaklass:

Renat sagte, es sei besser, es so zu machen:

MqlRates mrate[] = {0};    //структура для хранения информации о ценах, объемах и спреде.

Versuchen wir, es herauszufinden. Soweit ich mich erinnere, sprach Renat über die Initialisierung einer einfachen Variablen, nicht eines Arrays. Im Referenzhandbuch sind mit Kämpfen ähnliche Beispiele erschienen:

//--- инициализация всех полей структуры нулевым значением
MqlTradeRequest request={0};

Sie hingegen versuchen, bei der Deklaration ein Array und nicht eine einfache Variable zu initialisieren. Dieses Beispiel habe ich im Handbuch gefunden:

double f[]     = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 };

Если размер инициализируемого массива не указан, то он 
определяется компилятором, исходя из размера инициализирующей последовательности.

Das Array wird hier mit einer endlichen Anzahl von Werten initialisiert, und die Erklärung besagt, dass der Compiler die Größe eines solchen Arrays auf der Grundlage der Anzahl dieser Werte bestimmt. Ich bin zu faul, das zu überprüfen - die Größe des Arrays f[] aus dem Beispiel ist höchstwahrscheinlich 6.

In Ihrem Beispiel ist die Größe der {0} Initialisierungssequenz 1. Folglich wird der Compiler höchstwahrscheinlich die Größe des Arrays mrate[] als 1 definieren. In diesem Fall ist es interessehalber so zu formulieren:

MqlRates mrate[] = {0,0,0,0,0,0,0,0,0,0,0,0};    //структура для хранения информации о ценах, объемах и спреде.
Wird dies einen Fehler verursachen?
 
papaklass:
Ich war verwirrt. Swan hat es deutlich erklärt. Ich habe die falsche Struktur gewählt. Es muss überhaupt nicht initialisiert werden, da es Werte annimmt. Diejenigen, die ihre Werte angeben, müssen Sie initialisieren. Ich habe mich geirrt.

Nun, das ist die Hauptsache. Die Frage nach Renate war an sich schon interessant, also habe ich mir auch etwas dabei gedacht.

 

double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; keine dynamische Anordnung.

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
220Volt:

double f[] = { 0.0, 0.236, 0.382, 0.5, 0.618, 1.0 }; nicht-dynamisches Array.

double f[] ist selbst ein dynamisches Array. Dieses Array wird bei der Erstellung deklariert. Ich habe nicht analysiert, ob sie nach der Initialisierung mit der endlichen Initialisierungssequenz nicht mehr dynamisch sein wird. Das Wichtigste, was Sie oben herausgefunden haben, ist, dass das deklarierte Array nach der Initialisierung eine bestimmte Größe annimmt.

Wollen Sie damit sagen, dass ein dynamisches Array im Ergebnis einer expliziten Initialisierung nicht mehr dynamisch ist, d.h. seinen dynamischen Status und seine Eigenschaften verliert? - Vielleicht, aber ich bezweifle es. Frage: Aus welchen Gründen (warum) hört ein dynamisches Array double f[] auf, ein dynamisches Array zu sein?

 
Yedelkin:

double f[] ist selbst ein dynamisches Array. Sie wird bei der Schöpfung erklärt. Ich habe nicht untersucht, ob sie nach der Initialisierung durch die endgültige Initialisierungssequenz nicht mehr dynamisch ist. Das Wichtigste, was Sie oben herausgefunden haben, ist, dass das deklarierte Array nach der Initialisierung eine bestimmte Größe annimmt.

Wollen Sie damit sagen, dass ein dynamisches Array als Ergebnis einer expliziten Initialisierung aufhört, dynamisch zu sein, d.h. es verliert seinen dynamischen Status und seine Eigenschaften? - Vielleicht. Die Frage ist dann: Warum?

Der springende Punkt ist, dass wir in MKL ein wenig von der realen Welt "isoliert" sind )), der Compiler entscheidet in einer solchen Situation für uns. Wenn er es sieht:

double f[5];
double f[] = {0, 1, 3};

erstellt ein statisches Array (ohne die Möglichkeit, die Größe zu ändern). Wenn er es sieht:

double f[];

erzeugt die Struktur struct MqlArrayObject (sie verhält sich wie ein dynamisches Array) im globalen Speicher. Daher können Sie ein Array nicht nach der Deklaration initialisieren (double f[]; f = {6};)

P.S.: alles Geschriebene ist mein IMHO, ich könnte irgendwo falsch liegen.

 

Frage eines Dummkopfs: Stimmt es, dass, wenn der Compiler die Zeichenfolge

double f[] = {0, 1, 3};

zunächst ein statisches Array anstelle eines dynamischen Arrays erstellt wird?

Es gibt eine Regel:"Bei der Deklaration eines dynamischen Arrays (ein Array mit einem nicht spezifizierten Wert im ersten Paar eckiger Klammern) erstellt der Compiler automatisch eine struct-Variable MqlArrayObject(ein dynamisches Array-Objekt) und stellt Code für die richtige Initialisierung bereit. Oder ist das Vorhandensein der endgültigen Initialisierungssequenz gleichbedeutend mit "expliziter Angabe aller signifikanten Array-Dimensionen" und führt zur Erstellung eines statischen Arrays?

 
Yedelkin:

Frage eines Dummkopfs: Stimmt es, dass, wenn der Compiler die Zeichenfolge

zunächst ein statisches Array anstelle eines dynamischen Arrays erstellt wird?

Es gibt eine Regel:"Bei der Deklaration eines dynamischen Arrays (ein Array mit einem nicht spezifizierten Wert im ersten Paar eckiger Klammern) erstellt der Compiler automatisch eine struct-Variable MqlArrayObject(ein dynamisches Array-Objekt) und stellt Code für die richtige Initialisierung bereit. Oder ist das Vorhandensein der endgültigen Initialisierungssequenz gleichbedeutend mit "expliziter Angabe aller signifikanten Array-Dimensionen" und führt zur Erstellung eines statischen Arrays?

Ist es schwach, das zu überprüfen?

;)

 
MetaDriver:

Können Sie das nicht überprüfen?

;)

Im Moment nicht viel. Ich werde nicht vor heute Abend zum Terminal kommen. Sonst hätte meine Antwort für 220Volt anders geklungen, wie Sie verstehen :) Ich konnte die Informationen nicht im Handbuch finden. Vielleicht habe ich nicht genau genug hingesehen, aber ich habe genau hingesehen.
 
Yedelkin:
Im Moment ist sie noch schwach. Ich werde nicht vor heute Abend zum Terminal kommen. Sonst hätte meine Antwort auf 220Volt anders geklungen, wie Sie verstehen :) Ich konnte die Informationen nicht im Handbuch finden. Vielleicht habe ich nicht genau genug hingesehen, aber ich war akribisch.

OK, ich bin nicht mehr im Terminal. :) Ich bin auch außerhalb des Terminals.

Elementar geprüft - versucht, ArrayResize(...) zu verwenden

Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
Операции с массивами / ArrayResize - Документация по MQL5