Fehler, Irrtümer, Fragen - Seite 2243

 
Vitaly Murlenko:

Der Code im mql4-Indikator funktioniert nicht mehr. Wie kann ich ihn reparieren?

Editor sagt 'ObjectSetInteger' - keine der Überladungen kann auf den Funktionsaufruf angewendet werden

Es hat jahrelang funktioniert und dann plötzlich aufgehört. Das ist eine Schande.


else{// Иначе стрелка создана. Задаём её свойства
 ObjectSetInteger(ChartID(),Open_name,OBJPROP_ARROWCODE,OpenArrowCode);//код стрелки 232 // или 0 вместо ChartID() для текущего графика 
 ObjectSet(Open_name,OBJPROP_COLOR,ObjColor);//цвет стрелки
}

Aber warum haben Sie zwei Stile miteinander vermischt? Wenn Sie in der ersten Zeile den Pfeilcode angeben, verwenden Sie in der zweiten Zeile den gleichen Stil:

ObjectSetInteger(0,Open_name,OBJPROP_COLOR,ObjColor); //цвет стрелки
 

Ich habe versucht, eine neue Version des Indikators auf den Markt zu bringen. Der Test endete mit Fehlern. Fehlermeldung wie auf dem Bild im Anhang mit folgendem Inhalt:

Test auf EURUSD,H1 (Netting) Test auf XAUUSD,D1 (Netting) Test auf GBPUSD,M30 (Netting) Test auf EURUSD,M1 (Netting) 2016.05.31 21:45:00 Zugriffsverletzung bei 0x00007FF7FD1CA04B gelesen auf 0xFFFFFFFFFFFFFFFFFF 2016.05.31 21:45:00 00 00007FF7FD1CA010 4885D2 test rdx, rdx 2016.05.31 21:45:00 00 00007FF7FD1CA013 747B jz 0x7ff7fd1ca090 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA015 53 push rbx 2016.05.31 21:45:00 00 00007FF7FD1CA016 4883EC20 sub rsp, 0x20 2016.05.31 21:45:00 00 00007FF7FD1CA01A 48897C2430 mov [rsp+0x30], rdi 2016.05.3131 21:45:00 00 00007FF7FD1CA01F 488BD9 mov rbx, rcx 2016.05.31 21:45:00 00 00007FF7FD1CA022 488B7AF8 mov rdi, [rdx-0x8] 2016.05.31 21:45:00 00 00007FF7FD1CA026 4881FF00004000 cmp rdi, 0x400000 2016.31.05.21:45:00 00 00007FF7FD1CA02D 730B jae 0x7ff7fd1ca03a 2016.05.31 21:45:00 00 00007FF7FD1CA02F 4883E980 sub rcx, 0x80 2016.05.31 21:45:00 00 00007FF7FD1CA033 E88852CAFF call 0x7ff7fce6f2c0 ; #2504 (metatester64.exe) 2016.05.31 21:45:00 00 00007FF7FD1CA038 EB37 jmp 0x7ff7fd1ca071 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA03A 488D4AE8 lea rcx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA03E 488B52E8 mov rdx, [rdx-0x18] 2016.05.31 21:45:00 00 00007FF7FD1CA042 4885D2 test rdx, rdx 2016.05.3131 21:45:00 00 00007FF7FD1CA045 7408 jz 0x7ff7fd1ca04f 2016.05.31 21:45:00 2016.05.31 21:45:00 00 00007FF7FD1CA047 488B4108 mov rax, [rcx+0x8]
Vielleicht liegt das Problem im Tester?
Dateien:
 
Artyom Trishkin:

Aber warum haben Sie die beiden Stile vermischt? Wenn Sie die erste Zeile für den Pfeilcode verwenden, dann verwenden Sie die zweite Zeile im gleichen Stil:

Danke, das hat geholfen.

Zwei Stile? Ich wusste nichts von den Stilen. Es ist nur so, dass man diesen Abschnitt bisher nur auf diese Weise machen konnte. Es hat sich eine Veränderung ergeben. Ich programmiere seit mehr als 10 Jahren in MQL4. Und jetzt haben die Entwickler die Sprache geändert und viele meiner Codes funktionieren nicht mehr. Ich bin sehr enttäuscht. Die Veränderungen waren nicht zum Besseren. Das bedeutet, dass ich eine große Menge an Codes neu erstellen muss. Auch wenn sie alt sind, wurden sie viel benutzt.

 
Gennadiy Stanilevych:

Ich habe versucht, eine neue Version des Indikators auf den Markt zu bringen. Der Test endete mit Fehlern. Fehlerbericht wie in der Abbildung im Anhang dargestellt mit folgendem Inhalt:

Vielleicht liegt das Problem beim Tester?

Bitte stellen Sie eine Anfrage an servicedesk, wir werden es herausfinden


UPD: Ich habe Ihre Anfrage gefunden.
 
Artyom Trishkin:

Gibt den Puffer eines beliebigen dynamischen Arrays frei und setzt die Größe der Null-Dimension auf 0.

Wenn Skripte und Indikatoren geschrieben werden, kann die Notwendigkeit, die Funktion ArrayFree() zu verwenden, selten auftreten, da der gesamte verwendete Speicher sofort freigegeben wird, und in benutzerdefinierten Indikatoren wird die Hauptarbeit mit Arrays durch den Zugriff auf Indikatorpuffer repräsentiert, deren Größe automatisch durch das Exekutivsubsystem des Terminals verwaltet wird.

Wenn Sie in Ihrem Programm Speicher unter komplexen dynamischen Bedingungen verwalten müssen, können Sie mit der Funktion ArrayFree() den von einem dynamischen Array belegten Speicher, der nicht mehr benötigt wird, explizit und sofort freigeben.

Siehst du? Unnötig.

Natürlich kann niemand für den Inhalt des Arrays garantieren, wenn der Speicher erst einmal freigegeben wurde und Sie ihn dann erneut zuweisen, indem Sie dem Array eine Größe zuweisen.

Array-Initialisierung verwenden: ArrayInitialize()

Was meinen Sie damit, dass niemand für den Inhalt garantiert? Wenn der Speicher freigegeben wurde, ist er weg, wie kann man also Müll hineinbringen? Oder bedeutet das Löschen des Speichers, dass die Erlaubnis erteilt wird, dass dieser Speicher von einem anderen Teil des Programms verwendet werden kann, und nicht, dass er überhaupt gelöscht wird?

 
Aleksey Vyazmikin:

Was meinen Sie damit, dass niemand für den Inhalt garantiert? Wenn der Speicher gelöscht wurde, ist er nicht mehr vorhanden, wie kommt dann der Müll in den Speicher? Oder bedeutet das Löschen des Speichers, dass man die Erlaubnis gibt, dass dieser Speicher von einem anderen Teil des Programms verwendet werden kann, und nicht, dass er überhaupt gelöscht wird?

ArrayResize räumt den Speicher nicht auf, weshalb er Müll enthält, der vom vorherigen "Verbraucher" stammt.

Dies geschieht aus Geschwindigkeitsgründen, denn nachdem einem Array Speicher zugewiesen wurde, wird der Benutzer es in 99,99(9)% der Fälle mit seinen Daten "füllen".


 
Vitaly Murlenko:

Danke, das hat geholfen.

Zwei Stile? Ich wusste nichts von den Stilen. Es ist nur so, dass man diesen Abschnitt bisher nur auf diese Weise machen konnte. Es hat sich eine Veränderung ergeben. Ich programmiere seit mehr als 10 Jahren in MQL4. Und jetzt haben die Entwickler die Sprache geändert und viele meiner Codes funktionieren nicht mehr. Ich bin sehr enttäuscht. Die Veränderungen waren nicht zum Besseren. Das bedeutet, dass ich eine große Menge an Codes neu erstellen muss. Sie mögen alt sein, aber sie waren eine ganze Wagenladung nützlicher.

Wurde der Pfeilcode nicht auf diese Weise festgelegt, bevor die mql4 ObjectSetXXX-Funktionen eingeführt wurden?

ObjectSet(Open_name,OBJPROP_ARROWCODE,OpenArrowCode);

Ich habe auch in mql für etwa 10 Jahre (vielleicht mehr - wie die Zeit vergeht ...) schreiben - ich beginne zu vergessen, streng Quaternary Funktionen - ich schreibe Multiplattform-Code, wenn möglich.

 
Ilyas:

ArrayResize löscht den Speicher nicht, deshalb enthält er Müll vom vorherigen "Verbraucher".

Dies geschieht aus Geschwindigkeitsgründen, denn nach der Zuweisung von Speicher an ein Array wird der Benutzer dieses in 99,99(9)% der Fälle mit seinen Daten "füllen".


Warum sind dann die numerischen Werte auch nach einem Neustart des Terminals Konstanten, die "Unsinn" sind?

Ich persönlich bin bei der einfachen Summierung der Inhalte von Zellen in einem anderen Array hängen geblieben und habe lange über das Problem gegrübelt.

      for(int i=1;i<StrokTotal; i++)
        {
         for(int s=3;s<56+1; s++)
           {               
            SummArrA[s]=SummArrA[s]+ArrTest[i,s];
           }
        }     
 
Aleksey Vyazmikin:

Warum sind dann die numerischen Werte auch nach einem Neustart des Terminals Konstanten, die "Unsinn" sind?

Ich persönlich habe mich an einer einfachen Summierung der Inhalte der Zellen eines anderen Arrays verbrannt und habe mich lange Zeit gefragt, was falsch war.

Es spielt keine Rolle, welche Art von Daten in dem nicht initialisierten Array enthalten ist, die Daten können sich jederzeit ändern, niemand garantiert ihren Wert.
Deshalb führt die Verwendung von nicht initialisierten Variablen (Speicher auslesen) manchmal zu Situationen, in denen es sehr lange dauert, die Ursache zu finden:

  1. Funktioniert auf einem Computer, auf dem anderen nicht
  2. Funktioniert im Terminal, nicht im Prüfgerät
  3. Terminal/OS aktualisiert und Programm verhält sich anders
  4. Hinzugefügt Drucken funktioniert nicht mehr.
  5. usw.

Ich kann nur einige Ratschläge geben.
Sie sollten sich angewöhnen, Daten immer zu initialisieren, damit Sie in Zukunft nicht viel Zeit mit der Suche nach Fehlern im Zusammenhang mit der fehlenden Initialisierung verschwenden.

Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
Автоматическое обновление - Для продвинутых пользователей - MetaTrader 5
  • www.metatrader5.com
В платформу встроена система автоматического обновления. Она позволяет своевременно получать и устанавливать новые версии программы. Эту систему отключить нельзя. Порядок обновления При подключении к торговому серверу происходит проверка наличия обновлений платформы. Если найдено обновление какого-либо из компонентов торговой платформы...
 
Aleksey Vyazmikin:

Was meinen Sie damit, dass niemand für den Inhalt garantiert? Wenn der Speicher gelöscht wurde, ist er nicht mehr vorhanden, wie kommt dann der Müll in den Speicher? Oder bedeutet das Löschen des Speichers, dass man die Erlaubnis gibt, dass dieser Speicher von einem anderen Teil des Programms verwendet werden kann, und nicht, dass er überhaupt gelöscht wird?

Was meinen Sie mit "nein"? Sie entfernen den Speicherstick nicht aus dem Steckplatz der Hauptplatine. Und wenn der Speicher vorhanden ist und freigegeben wird (nicht mit einem Wert initialisiert, sondern freigegeben), dann wird er für andere Programmbedürfnisse verwendet.