Fehler, Irrtümer, Fragen - Seite 2045

 

Aber ich habe dort die falsche Array-Dimension eingestellt, vielleicht hat sich das irgendwie ausgewirkt (obwohl es sich gar nicht auswirken sollte).

Versuchen Sie dies mit Dimension = 3

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[3]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }
 

Ich habe die Ursache der Diskrepanz entdeckt. Bei OPTIMIZE=0 tritt ein Fehler auf, aber nicht bei OPTIMIZE=1. Ich verwende normalerweise nur OPTIMIZE=0

 
fxsaber:

Wenn ich eine logische (nicht widersprüchliche) Erklärung für das Ergebnis finde, sehe ich den Fehler nicht. Ich denke nicht, dass es akzeptabel ist, einen Fehler zu beweisen, wenn das Ergebnis nicht mit C++ übereinstimmt. Es ist in C++, dass jemand so gedacht und es getan 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. Das ist nicht das Ergebnis einer unmerklichen Auferlegung von Stereotypen, wie es sein sollte", wenn man Programmiererfahrung sammelt.

Wenn Sie keine eigene Erklärung haben, bedeutet dies, dass kein Fehler vorliegt. Und wenn diese Erklärung ein Jahr später auftaucht und ziemlich überzeugend ist, muss dann jeder alles neu machen? In C++ haben sie schon hundertmal darüber nachgedacht, warum man es so und nicht anders macht. Und die Erklärung ist erforderlich, wenn etwas in MQL anders eingerichtet ist als in C++ und nicht umgekehrt.

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


Aber nicht eine Funktion.

Dann sollten statische Klasseninstanzen verboten werden - denn sie werden durch eine Konstruktorfunktion initialisiert

 

Und hier noch mehr zum Thema der Variableninitialisierung. Wenn Sie sich an die Angaben in der Dokumentation halten, können Sie auch nicht auf andere globale/statische Variablen verweisen. Da es sich nicht um einen konstanten Ausdruck handelt:

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

Aber im Moment funktioniert es. Und ich vermute, dass viele Menschen schon immer solche Konstrukte verwendet haben, ohne sich dessen bewusst zu sein. Aber es stellt sich heraus, dass die Entwickler sie jederzeit deaktivieren können. Und wie bei der Funktionsinitialisierung werden diese Codes zwar immer noch erfolgreich kompiliert, aber sie funktionieren nicht mehr richtig. Alles in allem ist die gesamte MMS eine Zeitbombe.

 
Alexey Navoykov:

Und hier noch etwas zur Initialisierung von Variablen. Wenn Sie sich an die Angaben in der Dokumentation halten, können Sie auch nicht auf andere globale/statische Variablen verweisen. Denn es handelt sich nicht um einen konstanten Ausdruck:

//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
CExpert ExtExpert;

wird durch eine Konstruktorfunktion initialisiert - Verbieten!

Dies ist der Fall, wenn man die letzten Beiträge logisch zusammenfasst

Alexey Navoykov:

Ich habe den Grund für diese Diskrepanz herausgefunden. Bei OPTIMIZE=0 tritt ein Fehler auf, aber nicht bei OPTIMIZE=1. Ich verwende immer nur OPTIMIZE=0.

Im 32-Bit-Terminal tritt ein Fehler bei jeder OPTIMIZE

int g1( int& t[] ) { return ArraySize( t ); }
int g2( int& t[] ) { return g1( t ); }
void OnStart()
{
        int t[] = { 1, 2, 3, 4, 5 }; //всего 5
        Print( g2(t)); //Результат:          3
}
 
A100:

wird durch eine Konstruktorfunktion initialisiert - Verbieten!

Dies ist der Fall, wenn man die letzten Beiträge logisch zusammenfasst

Nun, die Person hat sich da einfach falsch ausgedrückt. Natürlich handelt es sich um einen Initialisierungswert und nicht um eine Initialisierungsfunktion.


Und zum Teufel mit ihnen - Verbote. Sie verursachen nicht von sich aus Probleme. Wenn dieses Verbot aber in keiner Weise vom Compiler kontrolliert wird, sondern einen Algorithmus erzeugt, der die Sprachregeln umgeht, passt es überhaupt nicht. Jetzt müssen Sie den gesamten Code nach solchen Dingen durchsuchen und ständig auf der Hut sein. Scheiß auf diese Art der Programmierung, ich bleibe lieber bei der alten Version.

 
Alexey Navoykov:
Verstehe, dann entschuldige ich mich, ich habe es nicht sofort bemerkt. Ich bin natürlich erstaunt, wie sie es geschafft haben, es heimlich zu ändern und es niemandem zu sagen. Was ich nicht verstehe, ist, warum der Compiler nicht auf die Ausführung einer ungültigen Operation reagiert. Das heißt, der Fehler ist in jedem Fall vorhanden.
Warum glauben Sie, dass sie ungültig ist? Bitte verwenden Sie sie nach eigenem Ermessen. Das ganze Problem besteht darin, dass bei der Initialisierung einer statischen Variablen durch eine Funktion die Initialisierung "angehalten" und die Funktion ausgeführt wird. Und im obigen Beispiel gibt es noch eine statische Variable in dieser Funktion, die noch nicht initialisiert wurde. Eine Variable, die durch eine Funktion initialisiert wird, nimmt also einen anderen Wert an.
 
Alexey Navoykov:

Und hier noch mehr zum Thema der Variableninitialisierung. Wenn Sie sich an die Angaben in der Dokumentation halten, können Sie auch nicht auf andere globale/statische Variablen verweisen. Da es sich nicht um einen konstanten Ausdruck handelt:

Aber im Moment funktioniert es. Und ich vermute, dass viele Menschen schon immer solche Konstrukte verwendet haben, ohne sich dessen bewusst zu sein. Aber es stellt sich heraus, dass die Entwickler sie jederzeit deaktivieren können. Und wie bei der Funktionsinitialisierung werden diese Codes zwar immer noch erfolgreich kompiliert, aber sie funktionieren nicht mehr richtig. Alles in allem ist der gesamte MQL-Code eine Mine, die in Zeitlupe arbeitet.

Na ja... In diesem Beispiel gibt es keine Diskrepanz zu der Beschreibung in der Dokumentation... Schauen Sie sich das Zitat aus der Dokumentation genau an

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


oder durch einen konstanten Ausdruck

int a= 1;
int b= a+1;

Diese Initialisierung ist möglich. Denn die Variable 'a' wird durch eine Konstante initialisiert und die Variable 'b' durch einen konstanten Ausdruck.

 
A100:

Dann müssen Sie statische Instanzen von Klassen verbieten, da diese durch eine Konstruktorfunktion initialisiert werden

Achten Sie auf

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Alexey Viktorov, 2017.10.18 09:19

Warum glauben Sie, dass Sie sich verändert haben, warum ist es inakzeptabel? Bitte verwenden Sie sie nach eigenem Ermessen. Das ganze Problem besteht darin, dass bei der Initialisierung einer statischen Variablen durch eine Funktion die Initialisierung "angehalten" und die Funktion ausgeführt wird. Und im obigen Beispiel gibt es noch eine statische Variable in dieser Funktion, die noch nicht initialisiert wurde. Eine Variable, die durch eine Funktion initialisiert wird, nimmt also einen anderen Wert an.
Leider weiß ich nicht, ob es möglich ist, statische Variablen im Konstruktor zu deklarieren und zu initialisieren, aber ich hoffe, Sie werden mir das mitteilen. Und, so wie ich es verstehe, ist die Initialisierungssequenz sehr wichtig.
Grund der Beschwerde: