MetaTrader 4 Build 529 beta mit neuem Compiler veröffentlicht - Seite 17

 
Barbarian:

Hat es vorher funktioniert? Ich kann nicht herausfinden, wofür Sie die Variable i deklarieren:


Bei globalen Variablen initialisiere ich i einmal und verwende es dann in allen Schleifen, das ist bequemer und einfacher ...
 
ALXIMIKS:

Wenn Sie die Parameter eines bereits laufenden und funktionierenden Indikators ändern, indem Sie auf ihn doppelklicken, soll das so sein?

der Indikatorkeine statischen Variablen aktualisiert und daher nicht neu gezeichnet wird?


Statische Variablen behalten ihren Wert bei einer Neuinitialisierung des Programms. Die Werte werden nur dann nicht gespeichert, wenn das Programm aus dem Diagramm entfernt und wieder eingefügt wird. Um statische Variablen bei der Neuinitialisierung zurückzusetzen, verwende ich diese Konstruktion:

bool g_init;

void OnInit()
{
   g_init = true;
}

void MyFunction()
{
   static int myStatic;
   if (g_init)
   {
      myStatic = 0;
      g_init = false;
   }
}
 
VOLDEMAR:
So funktioniert es ...

So funktioniert das nicht.


Im zweiten Fall ist der Geltungsbereich des in der Funktion deklarierten Arrays eine Funktion.

Im Code

for(i=Coment-1; i>=1; i--){info[i]=info[i-1]; cv  [i]=cv  [i-1];}info[0]=txt;cv[0]=et;


Sind Sie sicher, dass Sie alle Array-Elemente mit den Werten txt und et initialisieren? Vielleicht sollten die letzten 2 Aufgaben vor der Schleife kommen und die Schleife sollte anders aufgebaut sein. Oder ist es eine solche Idee?

 
Scriptong:


Statische Variablen behalten ihren Wert bei der Reinitialisierung eines Programms. Die Werte bleiben nur dann nicht erhalten, wenn das Programm aus dem Diagramm entfernt und wieder angehängt wird. Um statische Variablen bei der Neuinitialisierung zurückzusetzen, verwende ich die folgende Konstruktion:


Jetzt muss ich also die Bibliothek durchsuchen und alles neu schreiben? Das ist absurd, denn in 509 war alles in Ordnung, und hier ......
 
alexvd:


Im zweiten Fall ist der Anwendungsbereich eines in einer Funktion deklarierten Arrays eine Funktion.

Im Code.


Sind Sie sicher, dass Sie alle Array-Elemente mit txt und et initialisieren? Wahrscheinlich sollten die letzten 2 Aufgaben vor der Schleife kommen. Oder ist das eine Idee?


Der Text wird in der Schleife zunächst um eine Ebene verschoben, dann werden die Nullwerte dem neuen Text zugewiesen...

Diese Arrays werden nur in den Funktionen verwendet, die ich oben vorgestellt habe ...

Früher in 509 und früheren Builds funktionierte in beiden Fällen alles ... Jetzt nur im ersten Fall ...

 
ALXIMIKS:

Was bringt es, die Bibliothek zu durchforsten und alles neu zu schreiben? Das ist absurd, denn im Jahr 509 war alles in Ordnung und jetzt ist es ......


Es ist einfach besser, alle Variablen, die im Code verwendet werden sollen, am Anfang des Codes zu initialisieren...

Dies vereinfacht die Arbeit und macht es möglich, die Variablen zu Beginn des Programms zu sehen und korrekt zurückzusetzen und weiter zu verwenden ...

 
ALXIMIKS:

Wenn Sie die Parameter eines bereits laufenden und funktionierenden Indikators ändern, indem Sie auf ihn doppelklicken, soll das so sein?

Der Indikatoraktualisiert keine statischen Variablen, deshalb wird er nicht neu gezeichnet?

Soweit ich mich erinnere, war das schon immer so (im 509er Build jedenfalls). Es ist ein Fehler.

VOLDEMAR:

Ich habe auf verschiedenen Computern, einem mit XP und einem anderen mit W 7, etwas Merkwürdiges festgestellt

Wenn ein Array innerhalb einer Funktion initialisiert wird, wird das Array nicht mit dem gesamten Wert gefüllt, sondern nur mit dem Wert 0 ...

Wenn ein Array auf globaler Ebene über alle Funktionen hinweg initialisiert wird, werden die Arrays vollständig gefüllt, so wie es sein sollte ...

Es ist schon tausendmal gesagt worden - initialisieren Sie Arrays und Variablen explizit, warten Sie nicht auf "himmlischen Segen".

Im Falle einer lokalen Erklärung hat man einfach Glück und es kommt kein Müll. Aber ich würde mich nicht darauf verlassen.

 
Bitte beachten Sie, dass der neue Compiler und die neue Ausführungsumgebung die Codequalität um ein Vielfaches strenger kontrollieren. Ein großer Teil des MQL4-Codes wurde von Drittentwicklern mit heruntergezogenen Händen geschrieben, und jetzt werden diese Fehler sofort sichtbar sein.
 

Korrigieren Sie mich, wenn ich das falsch verstanden habe.

Ich verwende eine Bibliotheksfunktion in einem Indikator. Diese Funktion deklariert einige statische Variablen, die an der Berechnung des Indikator-Arrays beteiligt sind.

Wenn ich die Indikatorparameter ändern möchte, um die Indikatorberechnung zu korrigieren (abhängig von statischen Variablen),

Übergeben Sie das Flag an die Bibliotheksfunktion, die für die Reinitialisierung zuständig ist (Sie sollten die Eingabeparameter jeder Funktion, die statische Variablen hat, erweitern)

statische Variablen im Hauptteil auf Null setzen und nicht vergessen, die Markierung zu entfernen, bevor die Berechnung abgeschlossen wird.

Es wäre viel einfacher, wenn statische Variablen einen Parameter hätten, der bei ihrer Deklaration festgelegt wird und dafür verantwortlich ist, ob diese Variablen bei der Reinitialisierung auf Null zurückgesetzt werden.

 
Renat:
Bitte beachten Sie, dass der neue Compiler und die neue Laufzeitumgebung die Qualität des Codes viel strenger kontrollieren. Ein großer Teil des MQL4-Codes wurde von Drittentwicklern geschrieben, und jetzt werden diese Fehler sofort sichtbar sein.
Ist das MQL4-Handbuch (das sich im Editor befindet) auch entsprechend aktualisiert worden?