Errores, fallos, preguntas - página 1034

 
TheXpert:
De hecho, tiene sentido, porque lo que está escrito parece un poco delirante.
C++ no lo cree. Y en cuanto a las tonterías, este es un ejemplo lo más simplificado posible para que se entienda.
 
A100:
C++ no lo considera así.

Sí, C++ no cuenta muchas cosas, pero la cuestión es que la inicialización de los miembros estáticos probablemente no sea en el orden en que se inicializan, sino en el orden en que se declaran.

Tendré que leer la norma sobre este tema.

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

Lo hice demasiado fácil - no moví const - como puedes ver ahora todo está claro - una constante es inicializada por otra:

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

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

El compilador indica como error que el miembro s1 está protegido. Si sustituimos protected por public, todo funciona como un reloj. Pero el hecho de estar protegido no tiene nada que ver con el orden de inicialización o de asignación, ni con la posibilidad de inicializar con un valor determinado

 
TheXpert:

Tendré que leer la norma sobre esto.

Estoy de acuerdo, en general el compilador no es lo mismo que el compilador y hay que solucionarlo.

He aquí otro ejemplo

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

El compilador MQL aquí no quiere inicializar el array con el valor const int (enum - pasa)

De nuevo apelo al hecho de que C++ lo copia e inicializa correctamente.

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - Документация по MQL5
 
Probablemente un error en la secuencia de llamada
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 ??? как же так?
}
En el último caso esperaba el resultado: 3 4 4 similar al anterior. No es normal que algunos tipos tengan una secuencia de llamada y otros una diferente.
 
A100:
Probablemente un error en la secuencia de llamada
En C++, el orden en que se evalúan los operandos de una expresión es UB. ¿Por qué te basas en un orden específico aquí?
 
TheXpert:
En C++, el orden de evaluación de los operandos de una expresión es UB. ¿Por qué te basas en un orden específico aquí?
¿Has visto alguna vez en algún sitio que
 cout << "Hello " << "word";

se emitió como "palabra Hola" ?

Esto es lo que ocurre en este caso para un operador sobrecargado para el tipo int, mientras que para el tipo string todo sale normalmente.

Además, no tiene nada que ver con C++. Suponga que escribe en su código

f(); // a << x;
g(); // a << f( x );
h(); // a << x;
Y estas funciones se ejecutan en orden inverso o en absoluto para diferentes tipos de argumentos - en cualquier orden
 
Por cierto - la secuencia de operaciones de desplazamiento de izquierda a derecha también está definida en el propio MQL5, como confirma el ejemplo:
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 );
}
 

¡Saludos!

Ayúdenme a arreglar el acceso al puntero inválido.

En OnInit() tenemos:

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

El métodoCSymbolsCollection::RefreshRealSymbols() tiene una llamadaCleanSymbolsArray(myRealSymbols);

Estos métodos y variables se declaran en la clase como:

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

El problema es queRefreshRealSymbols() se ejecuta normalmente si se llama en el constructorCSymbolsCollection.

Sin embargo, llamar a SymbolsCollection.RefreshRealSymbols(); en OnInit(); da como resultado:

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

El error apunta a la línea CleanSymbolsArray(myRealSymbols); en el cuerpo del método CSymbolsCollection::RefreshRealSymbols(), la posición es justo después del paréntesis de apertura.

¿Alguna idea?

 
vlad_123:
...

¿Alguna idea?

¿No es esto?