Fehler, Irrtümer, Fragen - Seite 1034

 
TheXpert:
Es macht sogar Sinn, denn das Geschriebene sieht ein wenig wahnhaft aus.
C++ sieht das nicht so. Und was den Unsinn betrifft, so ist dieses Beispiel so vereinfacht, wie es möglich ist, um die Sache zu verdeutlichen.
 
A100:
C++ sieht das nicht so.

Ja, in C++ werden viele Dinge nicht gezählt, aber der Punkt ist, dass die Initialisierung statischer Mitglieder wahrscheinlich nicht in der Reihenfolge erfolgt, in der sie initialisiert werden, sondern in der Reihenfolge, in der sie deklariert werden.

Ich werde die Norm zu diesem Thema lesen müssen.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - Документация по MQL5
 

Ich habe es mir zu einfach gemacht - ich habe die Konstante nicht verschoben - wie Sie jetzt sehen können, ist alles klar - eine Konstante wird durch eine andere initialisiert:

class A {
protected: //если заменить на public: то все работает
        static const int s1;
        static const int s2;
};

const int A::s1 = 0x1;
const int A::s2 = A::s1; //ошибка компиляции

Der Compiler zeigt als Fehler an, dass das Mitglied s1 geschützt ist. Wenn wir protected durch public ersetzen, funktioniert alles wie am Schnürchen. Dass sie geschützt sind, hat jedoch nichts mit der Reihenfolge der Initialisierung oder der Zuweisung zu tun und auch nicht mit der Möglichkeit der Initialisierung mit einem bestimmten Wert

 
TheXpert:

Ich werde die Norm dazu lesen müssen.

Ich stimme zu, im Allgemeinen ist der Compiler nicht dasselbe wie der Compiler, und man muss es herausfinden.

Hier ein weiteres Beispiel

enum _ENUM { en = 0x1 };
const int cc = 0x2;
static int s_array1[] = { cc }; //ошибка
static int s_array2[] = { en }; //нормально

class A {
public:
        static const int s;
        static int Array[];
};
const int A::s = 0x3;
int A::Array[] = {
        en,     //нормально
        A::s,   //ошибка
        cc      //ошибка
};

Der MQL-Compiler will hier das Array nicht mit dem Wert const int initialisieren (enum - passes)

Auch hier berufe ich mich auf die Tatsache, dass C++ es kopiert und korrekt initialisiert.

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - Документация по MQL5
 
Wahrscheinlich ein Fehler in der Aufrufreihenfolge
class A {
public:
        A *operator<<( int x ) { Print( x ); return ( GetPointer( this )); }
        A *operator<<( string s ) { Print( s ); return ( GetPointer( this )); }
};

int f( int& x ) { return ( x = 4 ); }

void OnStart()
{
        Print( "" );
        A a;
        int x = 3;
        a << "(1)" <<  "(2)" << "(3)"; // Результат: (1) (2) (3) //нормально
        a <<  x   << f( x ) <<  x;   // Результат:  4   4   3 ??? как же так?
}
Im letzten Fall habe ich das Ergebnis erwartet: 3 4 4, ähnlich wie im vorherigen Fall. Es ist nicht normal, dass einige Typen eine Aufrufsequenz haben und andere eine andere.
 
A100:
Wahrscheinlich ein Fehler in der Aufrufreihenfolge
In C++ ist die Reihenfolge, in der die Operanden eines Ausdrucks ausgewertet werden, UB. Warum verlassen Sie sich hier auf eine bestimmte Reihenfolge?
 
TheXpert:
In C++ ist die Reihenfolge der Auswertung der Operanden eines Ausdrucks UB. Warum verlassen Sie sich hier auf eine bestimmte Reihenfolge?
Haben Sie jemals irgendwo gesehen, dass
 cout << "Hello " << "word";

wurde als "Wort Hallo" ausgegeben ?

Dies geschieht in diesem Fall bei einem überladenen Operator für den Typ int, während für den Typ string alles normal ausgegeben wird.

Außerdem hat es nichts mit C++ zu tun. Angenommen, Sie schreiben in Ihrem Code

f(); // a << x;
g(); // a << f( x );
h(); // a << x;
Und Sie lassen diese Funktionen in umgekehrter Reihenfolge oder überhaupt für verschiedene Arten von Argumenten ausführen - in beliebiger Reihenfolge
 
Übrigens - die Reihenfolge der Verschiebeoperationen von links nach rechts ist auch in MQL5 selbst definiert, wie das Beispiel bestätigt:
void OnStart()
{
        int a = 0x1;
        int b = a << 2 << a;   //b = 8
        int c = (a << 2) << a; //c = 8
        int d = a << (2 << a); //d = 16
        Print ( "b=", b, ", c=", c, ", d=", d );
}
 

Grüße!

Helfen Sie mir, den "ungültigen Zeigerzugriff" zu beheben.

In OnInit() haben wir:

SymbolsCollection = new CSymbolsCollection();
SymbolsCollection.RefreshRealSymbols();

Die MethodeCSymbolsCollection::RefreshRealSymbols() hat einen AufrufCleanSymbolsArray(myRealSymbols);

Diese Methoden und Variablen werden in der Klasse als deklariert:

public:
   CSymbol* myRealSymbols[];
   void CleanSymbolsArray(CSymbol* &inArray[]);

Das Problem ist, dassRefreshRealSymbols() normal ausgeführt wird, wenn es imCSymbolsCollection-Konstruktor aufgerufen wird.

Der Aufruf von SymbolsCollection.RefreshRealSymbols(); in OnInit(); führt jedoch dazu:

invalid pointer access in 'SymbolsCollection.mqh' (55,22)

Der Fehler bezieht sich auf die Zeile CleanSymbolsArray(myRealSymbols); im Körper der Methode CSymbolsCollection::RefreshRealSymbols(), die Position ist direkt nach der öffnenden Klammer.

Irgendwelche Ideen?

 
vlad_123:
...

Irgendwelche Ideen?

Das nicht?