Fehler, Irrtümer, Fragen - Seite 786

 

Die .ex5 eines der Indikatoren ist im Vergleich zur .ex5 des vorherigen Builds um fast das 10-fache gewachsen. Nun, das ist kein Problem. Beim Zeichnen des Indikators (vor der Eingabe seiner Parameter) trat jedoch ein Fehler auf:

2012.07.27 02:53:57     MP2012_GRI (EURUSD,M30) Access violation read to 0x000000003FF39D25

Ich habe den 3\4-Code bereits korrigiert. Und wenn ich wieder ein wenig auskommentiere, bekomme ich es (zusammen mit dem Fehler oben):

2012.07.27 02:56:42     Custom Indicator        'MP2012_GRI' may work incorrectly, as it requires more than 256Kb of stack memory
und es funktioniert wirklich nicht

Und wenn ich wieder ein wenig auskommentiere, verschwinden die ersten beiden Fehler, aber ich bekomme sie beim Entladen des Indikators:

2012.07.27 02:47:35     MP2012_GRI (EURUSD,M30) 9 leaked strings left
(Die Zahlen können unterschiedlich sein - je nachdem, wie viel Code ich auskommentiert habe)

Ich habe vorher herausgefunden, dass meine Funktion vom Volumen her zu groß ist - ich werde sie auf kleinen Funktionen schlagen.

...und beim letzten Build war alles in Ordnung

 
notused:

Die .ex5 eines der Indikatoren ist im Vergleich zur .ex5 des vorherigen Builds um fast das 10-fache gewachsen. Nun, das ist kein Problem. Beim Zeichnen des Indikators (vor der Eingabe seiner Parameter) trat jedoch ein Fehler auf:

Ich habe den 3\4-Code bereits korrigiert. Und wenn ich es ein wenig mehr ändere, erhalte ich (zusammen mit dem obigen Fehler):

Wir haben die Kontrolle über die Sandbox-Umgebung im Interesse einer besseren Sicherheit verschärft.

Die Meldung über den Stack sagt Ihnen, dass Sie in einer Ihrer Funktionen mehr als 256 Kilobyte Stack verwendet haben, was ein ernstes Problem beim Programmieren darstellt. In C/C++ beispielsweise gilt die Verwendung einer lokalen Stack-Funktion selbst bei 16 KB als ernste Warnung.

Wahrscheinlich weisen Sie z. B. viele statische Arrays in Funktionen zu:

void func(void)
  {
   double arr1[128000];
   double arr2[128000];
   double arr3[128000];

  }

Das dürfen Sie nicht tun.

Wenn Sie große Arrays benötigen, sollten Sie besser dynamische Arrays verwenden. Zum Beispiel:

double ExtArr[];

void func(void)
  {
   double arr1[];
   double arr2[];

   ArrayResize(ExtArr,128000,0);
   ArrayResize(arr1,128000,0);
   ArrayResize(arr2,128000,0);
  }
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

Wir haben die Kontrolle über die Sandbox-Umgebung verschärft, um die Sicherheit zu erhöhen.

Die Meldung über den Stack sagt Ihnen, dass Sie mehr als 256 Kilobyte in einer Funktion des Stacks verwendet haben, was ein ernstes Problem beim Programmieren darstellt. In C/C++ beispielsweise wird die Verwendung eines lokalen Stapels in einer Funktion, auch wenn er nur 16 KB groß ist, als ernste Warnung betrachtet.

Wahrscheinlich weisen Sie z. B. viele statische Arrays in Funktionen zu:

Das sollten Sie nicht tun.

Wenn Sie große Arrays benötigen, verwenden Sie stattdessen dynamische Arrays. Zum Beispiel:

Ich verwende in diesem Indikator überhaupt keine statischen Arrays; ich übergebe in Funktionen nichts Größeres als int usw. Aber Sie verwenden aktiv alle Arten von grafischen Funktionen.

Zum Beispiel,

   ObjectSetString(0, stmp, OBJPROP_TEXT, "HB");
   ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

Wenn die letzte Zeile auskommentiert wird, ist alles in Ordnung. Das Problem ist, dass wir eine Menge solcher Anrufe haben, und dieser eine

ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

ist der 20. oder 30. in Folge.

Ich denke, das Problem liegt in der Größe der Funktion, da die Kommentierung des Codes das Problem vermeidet, während der größte Teil des Codes aus ObjectSetXXX besteht. Ich habe durch Experimente herausgefunden, dass es auch nichts bringt, sie in kleinere Teile zu zerlegen - ein aggressiver Inliner wird immer noch alles anhäufen und Fehler erzeugen. Ich kann versuchen, mehr Code herauszugeben, aber ich werde es morgen tun. Der Service Desk ist auch morgen dran, wenn wir es nicht früher herausfinden.

 
notused:

Ich verwende in diesem Indikator überhaupt keine statischen Arrays; ich übergebe nichts Größeres als int an Funktionen usw. Aber alle Arten von grafischen Funktionen werden aktiv genutzt.

Aber es gibt etwas Großes, nicht wahr?

Fügen Sie zum Beispiel eine lokale Kopie einer Klasse ein, die nur eine Menge statischer Arrays in ihren Mitgliedern hat. Dort verstecken sich in der Regel die Einlagen der lokalen Stapelverbraucher.


Zum Beispiel,

Wenn die letzte Zeile auskommentiert wird, ist alles in Ordnung. Das Problem ist, dass wir eine Menge solcher Anrufe haben, und dieser eine

ist der 20. oder 30. in Folge.

Ich denke, das Problem liegt in der Größe der Funktion, da das Auskommentieren des Codes das Problem vermeidet, und der größte Teil des Codes besteht aus ObjectSetXXX. Ich habe durch Experimente herausgefunden, dass es auch nichts bringt, sie in kleinere Teile zu zerlegen - ein aggressiver Inliner wird immer noch alles anhäufen und Fehler erzeugen. Ich kann versuchen, mehr Code herauszugeben, aber ich werde es morgen tun. Service Desk auch morgen, wenn wir es nicht vorher herausfinden.

Funktionen aufteilen, in Klassen stapeln.

Inliner hat höchstwahrscheinlich nichts damit zu tun - er fügt keine allzu großen Codestücke ein. Vor allem, wenn sie schwer sind/viele lokale Variablen enthalten.

 
Renat:

Aber es gibt etwas Großes, nicht wahr?

Fügen Sie zum Beispiel eine lokale Kopie einer Klasse ein, die nur eine Menge statischer Arrays in ihren Mitgliedern hat. Dort verstecken sich in der Regel die Einlagen der lokalen Stapelverbraucher.


Funktionen aufteilen, in Klassen stapeln.

Inliner hat wahrscheinlich nichts damit zu tun - er fügt keine allzu großen Code-Blöcke ein. Vor allem, wenn sie schwere/viele lokale Variablen haben.

Service Desk #444495
 

Warum ist es so? schlampig Auszahlung oder was! nur 1 Agent verdient 1 kr und 0,3 kr machte eine Auszahlung pro Tag!


 

Achten Sie darauf, dass Sie an servicedesk mit diesen Kopfzeilen schreiben:

Terminalversion und Bitrate

...

Beschreibung des Problems

...

Abfolge von Aktionen ...

...

Ergebnis erhalten ...

...

Erwartetes Ergebnis ...

...

Zusätzliche Informationen ...

...

Oder können Sie es mit Ihren eigenen Worten ausdrücken?

 
Zeleniy:

oder können Sie das alles mit Ihren eigenen Worten ausdrücken?

Eine Liste wäre besser. Das wird das Leben derjenigen, die mit dem Fehler zu tun haben, sehr erleichtern.
 
Zeleniy:

Müssen Sie sich mit diesen Überschriften an servicedesk wenden?


oder kann ich es mit meinen eigenen Worten tun?

Sie können das alles mit Ihren eigenen Worten tun, aber

Terminalversion und Bitrate
Problembeschreibung

Handlungsablauf
Erzieltes Ergebnis
Erwartetes Ergebnis

unbedingt.

------------

Sie schreiben keinen Aufsatz über ein freies Thema, sondern einen Text für einen Entwickler, der schnell und ohne Details verstehen sollte, was Sie von ihm wollen.

 
sergeev:

Sie können alles selbst machen, aber

Terminalversion und Bitrate
Problembeschreibung

Handlungsablauf
Erzieltes Ergebnis
Erwartetes Ergebnis

unbedingt.

------------

Sie schreiben keinen Aufsatz über ein freies Thema, sondern einen Text für einen Entwickler, der schnell und ohne Details verstehen sollte, was Sie von ihm wollen.

Ich habe den Abschnitt Site mql5.com und den Vorschlag ausgewählt und verstehe nun nicht, wie ich ihn mit den Überschriften verbinden kann.