Erreurs, bugs, questions - page 1034

 
A100:
Le C++ n'est pas considéré de cette façon.

Oui, le C++ ne compte pas beaucoup de choses, mais le fait est que l'initialisation des membres statiques n'est probablement pas dans l'ordre dans lequel ils sont initialisés, mais dans l'ordre dans lequel ils sont déclarés.

Je vais devoir lire la norme sur ce sujet.

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

Je l'ai fait trop facile - je n'ai pas déplacé la constante - comme vous pouvez le voir maintenant tout est clair - une constante est initialisée par une autre :

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

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

Le compilateur indique comme une erreur que le membre s1 est protégé. Si nous remplaçons protected par public, tout fonctionne comme sur des roulettes. Mais le fait d'être protégé n'a rien à voir avec l'ordre d'initialisation ou l'ordre d'affectation, ni avec la possibilité d'initialisation avec une valeur particulière...

 
TheXpert:

Je vais devoir lire la norme à ce sujet.

Je suis d'accord, en général le compilateur n'est pas le même que le compilateur et vous devez faire le tri.

Voici un autre exemple

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      //ошибка
};

Le compilateur MQL ici ne veut pas initialiser le tableau avec la valeur const int (enum - passes)

Encore une fois, je fais appel au fait que le C++ le copie et l'initialise correctement.

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - Документация по MQL5
 
Probablement une erreur dans la séquence d'appel
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 ??? как же так?
}
Dans le dernier cas, je m'attendais à un résultat : 3 4 4 similaire au précédent. Il n'est pas normal que certains types aient une séquence d'appel et d'autres une séquence différente.
 
A100:
Probablement une erreur dans la séquence d'appel
En C++, l'ordre dans lequel les opérandes d'une expression sont évalués est UB. Pourquoi vous basez-vous sur un ordre spécifique ici ?
 
TheXpert:
En C++, l'ordre d'évaluation des opérandes d'une expression est UB. Pourquoi vous basez-vous sur un ordre spécifique ici ?
Avez-vous déjà vu quelque part que
 cout << "Hello " << "word";

a été affiché comme "mot Bonjour" ?

C'est ce qui se passe dans ce cas pour un opérateur surchargé pour le type int, alors que pour le type string tout est sorti normalement.

De plus, cela n'a rien à voir avec le C++. Supposons que vous ayez écrit dans votre code

f(); // a << x;
g(); // a << f( x );
h(); // a << x;
Et vous avez ces fonctions exécutées dans l'ordre inverse ou du tout pour différents types d'arguments - dans un ordre arbitraire
 
À propos - la séquence des opérations de décalage de gauche à droite est également définie dans MQL5 lui-même, comme le confirme l'exemple :
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 );
}
 

Salutations !

Aidez-moi à réparer le problème d'accès aux pointeurs invalides.

Dans OnInit() nous avons :

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

La méthodeCSymbolsCollection::RefreshRealSymbols() comporte un appelCleanSymbolsArray(myRealSymbols);

Ces méthodes et variables sont déclarées dans la classe comme :

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

Le problème est queRefreshRealSymbols() s'exécute normalement s'il est appelé dans le constructeur deCSymbolsCollection.

Cependant, l'appel de SymbolsCollection.RefreshRealSymbols() ; dans OnInit() ; a pour résultat :

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

L'erreur pointe vers la ligne CleanSymbolsArray(myRealSymbols) ; dans le corps de la méthode CSymbolsCollection::RefreshRealSymbols(), la position est juste après la parenthèse ouvrante.

Des idées ?

 
vlad_123:
...

Des idées ?

Pas ça?
 
A100:
Avez-vous déjà vu la sortie du mot "Hello" ?

Relisez attentivement ce que je vous ai écrit. Un calcul, pas un résultat.

Il s'agit d'une expression i += ++i +++.

Raison: