Erzwungenes Array-Clearing in MT5? - Seite 2

 
Artyom Trishkin:

Natürlich wissen Sie das.

Jeder Programmierer, der sich selbst und seine Programme respektiert, wird nicht zulassen, dass die Dinge ihren Lauf nehmen. In MQL4, wenn Sie #property strict nicht verwenden, können Sie sich auf ein Array mit der Größe 10 mit dem Index 20 beziehen. Und es passiert nichts - das Programm funktioniert weiter, aber es ist Sache des Programmierers zu entscheiden, was er als nächstes verwenden will. Wenn er klug ist, wird er sicherlich alles überprüfen und kontrollieren, um keine Werte außerhalb des Feldes zu erhalten, aber wenn er es "grob" macht, denkt er nicht an eine solche Kontrolle, und "die Hauptsache ist, dass es funktioniert, aber wie es funktioniert - irgendwie...".
Die meisten Benutzer, die sich nicht damit befasst haben, beschweren sich über "schlechtes, böses und kompliziertes MQL5", weil es ihnen nicht erlaubt, ihre eigenen Kreationen wie früher zu fälschen. Aber diejenigen, die ursprünglich dachten und Code mit Überprüfungen und Kontrolle der empfangenen Daten erstellten, bemerkten keinen Unterschied in der Komplexität der Sprachen und fragen sich nun - "wo ist die Komplexität - es ist die gleiche...".

Der Code hat gezeigt, dass Division durch Null ohne #property strict erlaubt ist und der Planet nicht in ein schwarzes Loch kollabiert, aber manchmal möchte man durch Null dividieren, aber sie lassen es nicht zu
 
Алексей Тарабанов:

Nikolai, machen Sie sich keine Sorgen um MQL4, dort ist alles in Ordnung. Der Themenstarter füllt die Felder nach Belieben. Alles.

Artyom Trishkin:

Natürlich wissen Sie das.

Ein Programmierer, der sich selbst und seine Programme respektiert, wird nicht alles schleifen lassen. In MQL4, wenn Sie #property strict nicht verwenden, können Sie sich auf ein Array mit der Größe 10 mit dem Index 20 beziehen. Und es passiert nichts - das Programm funktioniert weiter, aber es ist Sache des Programmierers zu entscheiden, was er als nächstes verwenden will. Wenn er klug ist, wird er sicherlich alles überprüfen und kontrollieren, um keine Werte außerhalb des Feldes zu erhalten, aber wenn er es "grob" macht, denkt er nicht an eine solche Kontrolle, und "die Hauptsache ist, dass es funktioniert, aber wie es funktioniert - irgendwie...".
Die meisten Benutzer, die sich nicht damit befasst haben, beschweren sich über "schlechtes, böses und kompliziertes MQL5", weil es ihnen nicht erlaubt, ihre eigenen Kreationen wie früher zu fälschen. Aber diejenigen, die ursprünglich dachten und Code mit Überprüfungen und Kontrolle der empfangenen Daten erstellten, bemerkten keinen Unterschied in der Komplexität der Sprachen und fragen sich nun - "wo ist die Komplexität - es ist die gleiche...".

Schade!
Nun, Petr, dank der Strenge von MQL5 haben Sie die Möglichkeit, den Code in eine relative Ordnung zu bringen und den Müllhaufen zu löschen.
Sie können sogar versuchen, den korrigierten Code mit #property strict zurück zu MQL4 zu kompilieren und vielleicht wird es schneller auf MT4 funktionieren

 
Nikolai Semko:

Schade!
Nun, Peter, dank der Strenge von MQL5 haben wir eine Chance, den Code in eine relative Ordnung zu bringen und die Müllberge zu beseitigen.
Sie können sogar versuchen, den behobenen Code mit #property strict zurück in MQL4 zu kompilieren und vielleicht wird es viel schneller in MT4 funktionieren

Auf diese Weise haben Sie a priori entschieden, dass mein Code voller Unsinn ist.

Lassen Sie mich erklären: Der Kern wird in mehreren Schritten gefüllt. Wenn bei der Deklaration von Array in MT5 Müll drin ist (was ich nicht wusste), dann ist das Array bei den ersten Schritten der Kernel-Erstellung in Funktionen außerhalb des Geltungsbereichs, weil ich statt Zeigern auf Variablen auf eine Kernelzelle durch eine andere verweise. Wenn sie Null enthält, ist es in Ordnung und sie erhält im zweiten Durchlauf den richtigen Wert, aber wenn sie Müll enthält, tritt ein kritischer Fehler auf.

Ist das für Sie klar?

 
Nikolai Semko:
Peter, ich weiß nicht, was du meinst.
...

Genau, du verstehst es nicht. Du vergleichst meine Aufgaben mit deinen eigenen...

 
...
Wenn es zu Überläufen kommt, suchen Sie bei sich selbst nach Fehlern.
Und wenn es Müll gibt, dann ist es Ihr Müll, den Sie nicht aufgeräumt haben.

Ich habe keine Überläufe. Bedenken Sie die Besonderheiten meiner Technologie (vergessen Sie, dass Sie sie ignorieren). Wenn Sie eine andere Zelle im Array als Zeiger auf eine Zelle verwenden und sich dort Müll befindet, dann ist das Array leer. Das Problem ist, dass Sie die zweite Runde der Kernelkonstruktion durchführen müssen, damit die Zelle, auf die Sie sich beziehen, den richtigen Wert erhält. Und in der zweiten Runde wird der Wert richtig sein. Aber man kommt nicht in die zweite Runde, weil man einen kritischen Fehler gemacht hat.

All dies ist darauf zurückzuführen, dass das Array als unsinnig deklariert wurde.

Wir müssen also Mechanismen erfinden, um das zweidimensionale Array (Kernel) in der Phase der ersten Größeneinstellung (Aufbau des regulären Bereichs) und in der Phase der zweiten Größenänderung des Kernels beim Aufbau des Benutzerbereichs zu löschen.

 
Реter Konow:

Genau, du verstehst es nicht. Verglichen, meine Aufgaben und Ihre eigenen...

Führen Sie einen Monolog - 10 weitere Beiträge hintereinander.

 
Реter Konow:

Auf diese Weise haben Sie a priori entschieden, dass mein Code voller Unsinn ist.

Lassen Sie mich erklären: Der Kern wird in mehreren Schritten gefüllt. Wenn bei der Deklaration von Array in MT5 Müll drin ist (was ich nicht wusste), dann ist das Array bei den ersten Schritten der Kernel-Erstellung in Funktionen außerhalb des Geltungsbereichs, weil ich statt Zeigern auf Variablen auf eine Kernelzelle durch eine andere verweise. Wenn sie Null enthält, ist es in Ordnung, und sie erhält im zweiten Durchlauf den richtigen Wert, aber wenn sie Unsinn enthält, tritt ein kritischer Fehler auf.

Ist das für Sie klar?

Das istüberhaupt nicht der Fall. Das liegt nicht am Müll, sondern am Fehlen von #property strict in mql4. Ohne dieses Gimmick erhält man 0 anstelle von array overrun, und in mql5 ist das bereits ein kritischer Fehler. Wahrscheinlich ist es besser, die Array-Länge zu überprüfen, anstatt den Inhalt eines nicht existierenden Array-Indexes.

 
Alexey Viktorov:

Das ist beiRetag überhaupt nicht der Fall. Schuld daran ist nicht der Müll, sondern das Fehlen von #property strict in mql4. Ohne dieses Gimmick erhält man 0 statt Array Overrun, und in mql5 bereits einen kritischen Fehler. Wahrscheinlich ist es besser, die Array-Länge zu überprüfen, anstatt den Inhalt eines nicht existierenden Array-Indexes.

Eine Grenzüberschreitung liegt vor, wenn sich in der anzeigenden Zelle Unrat befindet.

Zum Beispiel:

G_CORE[Объект][Канвас] = G_CORE[Окно][Его_канвас];

Initial:

G_CORE[Object][Kanvas] = -123423452345; (Quatsch)

G_CORE[Window][His_canvas]= -452345; (Quatsch)

//-----------------------------------------------------------------

Das Ergebnis ist außerhalb des Arrays.

Um es noch einmal zu wiederholen. Einige Zellen haben in MT4 Nullwerte und werden in der zweiten Runde in der ersten Stufe der Kernfüllung gefüllt.

In MT5 kommt es wegen des Mülls in den Zellen zu einem kritischen Fehler in der ersten Runde.

Hätten die Zellen im Array Nullen, gäbe es keinen Fehler und der Kernel würde sich sequentiell füllen (so wie es sein sollte).

 

Hier ist ein genaueres Beispiel:

Die erste Runde der Kernelkonstruktion. In einer der Funktionen:

int Ширина_канваса = G_CORE[G_CORE[Окно][Его_канвас]][_X_SIZE];

Если G_CORE[Окно][Его_канвас] = 234523452345; (мусор) то ошибка. А если бы G_CORE[Окно][Его_канвас] = 0; Ошибки нет, и ядро продолжает нормально строится.
 
Реter Konow:

Eine Grenzüberschreitung liegt vor, wenn sich in der anzeigenden Zelle Unrat befindet.

Zum Beispiel:

Initial:

G_CORE[Object][Kanvas] = -123423452345; (Quatsch)

G_CORE[Window][His_canvas]= -452345; (Quatsch)

//-----------------------------------------------------------------

Das Ergebnis ist außerhalb des Arrays.

Um es noch einmal zu wiederholen. Einige Zellen haben in MT4 Nullwerte und werden in der zweiten Runde in der ersten Stufe der Kernfüllung gefüllt.

In MT5 kommt es wegen des Mülls in den Zellen zu einem kritischen Fehler in der ersten Runde.

Wenn die Zellen des Arrays Nullen enthielten, würde kein Fehler auftreten und der Kernel würde sequentiell gefüllt werden (wie es sein sollte).

Die Nichtinitialisierung des Arrays ist vollständig die Schuld von kodopistael. Suchen Sie den Fehler in Ihrem eigenen Umfeld. Bauen Sie Ihren Algorithmus neu auf.