Fehler, Irrtümer, Fragen - Seite 2044

 
Alexey Navoykov:

Fehler bei der Initialisierung von statischen Variablen. In alten Builds war sie nicht vorhanden.

Wer hat nichts dagegen, dies an den Kundendienst zu schicken? Ich habe keine Lust mehr, dort mit ihnen zu kommunizieren.

Das ist kein Fehler, das wurde hier schon besprochen. Auszug aus

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Eigenheiten der Sprache mql4, Tipps und Tricks

Alexey Viktorov, 2017.04.30 08:54

Die Initialisierungssequenz: (für diejenigen, die es nicht kennen)

Zunächst globale Variablen, dann statische Variablen, die je nach Priorität der Funktionen OnInit(), OnTick() oder OnCalculate() angeordnet sind... Ich hatte kein Interesse an weiteren, und ich hatte auch kein Interesse an den lokalen, die es zu meiner Zeit gab. Es stellt sich also heraus, dass in diesem Code die Funktion aufgerufen wird, bevor die statischen Variablen initialisiert sind, daher der Fehler, von dem wir sprechen. Die Funktion wird aufgerufen, bevor die Variable initialisiert wird

 
fxsaber:

Das ist kein Fehler, das wurde hier schon besprochen. Auszug aus

Wenn es also zwischen Ihnen und Alexey Viktorov besprochen wurde, gibt Ihnen das Grund zu der Annahme, dass es sich nicht um einen Fehler handelt? ) Und dieser Mann sagt selbst, dass seine Programmierkenntnisse viel geringer sind als Ihre. Das heißt, er kann von der Liste gestrichen werden. Sie sind der Einzige, der noch übrig ist). Sie haben es mit sich selbst besprochen, also ist es kein Fehler).

Es ist ein Fehler. Es kann nicht sein, dass die Initialisierung einer Variablen grundsätzlich ignoriert wird und der Code durch Überspringen weiter ausgeführt wird. Das ist Unsinn. Und die Reihenfolge der Initialisierung spielt hier keine Rolle. Die Variable ist entweder initialisiert oder der Compiler erzeugt hier einen Fehler. Es gibt keinen dritten Weg. Andernfalls handelt es sich nicht um eine Programmiersprache, sondern um etwas anderes.

 

Ein weiterer Fehler in den neuen Builds:

template<typename T>
int F1(const T& array[])
{
  return ArrayMaximum(array);
}


template<typename T>
int F2(const T& array[]) { return F1(array); }


void OnStart()
  {
    int arr[4]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }


Eh, das ist so plump. Ich dachte, ich würde auf die neuen Builds upgraden, weil die alten keine Produkte im Market akzeptieren. Und hier ist eine Wanze auf einer Wanze!

 
Alexey Navoykov:

Wenn dies also zwischen Ihnen und Alexey Viktorov besprochen wurde, gibt Ihnen das Grund zu der Annahme, dass es sich nicht um einen Fehler handelt? ) Und diese Person gibt selbst an, dass ihre Programmierkenntnisse viel geringer sind als Ihre. Das heißt, er kann von der Liste gestrichen werden. Sie sind der Einzige, der noch übrig ist). Sie haben es mit sich selbst besprochen, also ist es kein Fehler).

Es ist ein Fehler. Es kann nicht sein, dass die Initialisierung einer Variablen grundsätzlich ignoriert wird und der Code durch Überspringen weiter ausgeführt wird. Das ist Unsinn. Und die Reihenfolge der Initialisierung spielt hier keine Rolle. Die Variable ist entweder initialisiert oder der Compiler erzeugt hier einen Fehler. Es gibt keinen dritten Weg. Andernfalls handelt es sich nicht um eine Programmiersprache, sondern um etwas anderes.

Du kannst es durchstreichen, ich spreizte nie meine Finger "was für ein Programmierer bin ich"...

Und Ihre Mutter sagt Ihnen nicht, dass Sie die Unterlagen lesen sollen? Speziell für solche Leute habe ich ein Zitat aus der Dokumentation eingefügt.

Es gibt ein Forum für den Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien

Eigenheiten von mql4, Tipps und Tricks

Alexey Viktorov, 2017.04.29 12:50

Ist es in Ordnung, dass die Hilfe sagt, dass statische Variablen... lesen Sie selbst

Eine statische Variable kann mit einer Konstante oder einem konstanten Ausdruck, der ihrem Typ entspricht, initialisiert werden , im Gegensatz zu einer einfachen lokalen Variable, die mit einem beliebigen Ausdruck initialisiert werden kann.


Aber nicht eine Funktion.

So funktioniert es

#property strict
#property indicator_chart_window

int TestBrokenStatic()
{
   static int stInt = 101;
   stInt++;
   return stInt;
}

int OnInit()
{
   static int result = 0;
   result = TestBrokenStatic();
   Print("TestStatic Expected result 102   - Actual result=", result);
   result = TestBrokenStatic();
   Print("TestStatic Expected result 103   - Actual result=", result);
   
   return INIT_SUCCEEDED;
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}
2017.04.29 13:49:51.546 !Test USDCHF,M15: TestStatic Expected result 103   - Actual result=103
2017.04.29 13:49:48.457 !Test USDCHF,M15: TestStatic Expected result 102   - Actual result=102
2017.04.29 13:49:40.089 Custom indicator Test\!Test USDCHF,M15: loaded successfully

 
Alexey Navoykov:

Ein weiterer Fehler in den neuen Builds:

Es ist so ungehobelt hier. Ich dachte, ich würde auf die neuen Builds upgraden, weil die alten keine Produkte im Market akzeptieren. Und dann ist da noch eine Wanze auf einer Wanze!

Und ich habe es richtig gemacht!

 
Alexey Viktorov:

Sie können es durchstreichen, ich spreizte nie meine Finger "was für ein Programmierer bin ich"...

Und Ihre Mutter sagt Ihnen nicht, dass Sie die Unterlagen lesen sollen? Speziell für diese Leute habe ich ein Zitat aus der Dokumentation eingefügt

Ich verstehe, dann entschuldige ich mich, ich habe es nicht sofort bemerkt. Es ist natürlich erstaunlich, wie sie es geschafft haben, es zu ändern, ohne dass es jemand bemerkt hat. Was ich nicht verstehe, ist, warum der Compiler nicht auf die Ausführung einer ungültigen Operation reagiert. D.h. es liegt auf jeden Fall ein Fehler vor
 
fxsaber:

Ich habe es richtig gemacht!


Hmmm, was ist Ihr Körperbau? Meine ist 1653.

 
Alexey Navoykov:

Wenn dies also zwischen Ihnen und Alexey Viktorov besprochen wurde, gibt Ihnen das Grund zu der Annahme, dass es sich nicht um einen Fehler handelt? ) Und diese Person gibt selbst an, dass ihre Programmierkenntnisse viel geringer sind als Ihre. Das heißt, er kann von der Liste gestrichen werden. Sie sind der Einzige, der noch übrig ist). Sie haben es mit sich selbst besprochen, also ist es kein Fehler).

Es ist ein Fehler. Es kann nicht sein, dass die Initialisierung einer Variablen grundsätzlich ignoriert wird und der Code durch Überspringen weiter ausgeführt wird. Das ist Unsinn. Und die Reihenfolge der Initialisierung spielt hier keine Rolle. Die Variable ist entweder initialisiert oder der Compiler erzeugt hier einen Fehler. Es gibt keinen dritten Weg. Andernfalls handelt es sich nicht um eine Programmiersprache, sondern um etwas anderes.

Wenn ich eine logische (konsistente) Erklärung für das Ergebnis finde, sehe ich keinen Fehler. Ich denke nicht, dass es akzeptabel ist, einen Fehler zu beweisen, wenn das Ergebnis nicht mit C++ übereinstimmt. Es ist jemand in C++, der so gedacht und gehandelt hat. Aber vielleicht dachten sie nicht so und haben es deshalb nicht getan. Deshalb ist es besser, sich nicht auf etwas da draußen zu beziehen, sondern sich auf die eigene innere Vorstellung von dem zu verlassen, was sein muss. Und es ist wünschenswert, dass dieses "Eigene" auch wirklich das Eigene ist. Und nicht das Ergebnis einer unmerklichen Auferlegung von Stereotypen, "wie es sein sollte", wenn man Programmiererfahrung sammelt.

Es macht mir nichts aus, falsch zu liegen. Ich lerne langsam mit meinem eigenen Schwader.

 
Alexey Navoykov:

Hmm, was ist Ihr Körperbau? Ich habe 1653.

1653x64.

 
fxsaber:

1653x64.

Seltsam, dass es dann eine Diskrepanz gibt...


Lassen Sie das von jemand anderem überprüfen.