Errori, bug, domande - pagina 1087

 

La notazione abbreviata dell'operatore postfix++ non compila quando il puntatore della classe base è esplicitamente castato in una classe derivata

class A {
};

class B : public A {
public:
        void    operator++( int ) {}
        void    operator++()      {}
};

void f( A* a )
{
        ((B *)a).operator++( 0 ); //нормально
        ((B *)a).operator++();    //нормально
        ++((B *)a);               //нормально
        ((B *)a)++;               //ошибка
}
 
Almeno il compilatore dovrebbe avvertire che a.f() non è const
class A {
public:
        int f() { return ( 1 ); }
};

class B {
public:
                B( const A *aa ) : a( aa ) {}
        int g() { return ( a.f() ); } //должно быть предупреждение, поскольку a.f() не const
        const A *a;
};
 
A100:
Almeno il compilatore dovrebbe avvertire che a.f() non è const
Grazie per la vostra diligenza, entrambi gli errori sono stati corretti.
 
mql5:
Grazie per la segnalazione, entrambi gli errori sono stati corretti.
Solo l'ultimo non è tecnicamente un errore - solo un avvertimento dovrebbe esserlo. È un errore solo se
class B {
public:
        A * const a;
};

Ma nei modelli, vi darò degli esempi più tardi.

 

Anche qui - non è chiaro.

class A {
public:
};

void ex1( const A* &t1, const A* &t2 )
{
        const A* t = t1;
        t1 = t2;
        t2 = t;
}

void OnStart()
{
    const A *a1 = new A(), *a2 = new A();
    Print( "Было :" a1, " ", a2 ); // Было :1 2
    ex1( a1, a2 );
    Print( "Стало:"  a1, " ", a2 ); // Стало:2 1
    delete( a1 );
    delete( a2 );
}

tutto funziona correttamente, ma se si aggiunge la funzione intermedia ex2(...)

void ex2( const A* &t1, const A* &t2 ) { ex1( t1, t2 ); }

void OnStart()
{
    сonst A *a1 = new A(), *a2 = new A();
    Print( "Было: ", a1, " ",  a2 ); // Было :1 2
    ex2( a1, a2 );
    Print( "Стало:",  a1, " ",  a2 ); // Cтало:2 2           <-----
    delete( a1 ); delete( a2 );
}

Il risultato è diverso. Cosa ha fatto ex2(...) ? - ha appena passato i puntatori per riferimento su

Si prega di dare un'occhiata a

 
A100:

Anche qui - non è chiaro.

tutto funziona correttamente, ma se si aggiunge la funzione intermedia ex2(...)

Il risultato è diverso. Cosa ha fatto ex2(...) ? - ha appena passato i puntatori per riferimento su

Si prega di dare un'occhiata a

Grazie, errore dell'ottimizzatore di lingua, risolto.
 

Non è la prima volta, ma è l'unica volta che si ottengono queste foto quando si caricano, il che significa che bisogna impostare alcuni criteri (probabilmente hai una certa dimensione).
). Vengono visualizzati normalmente dappertutto. Per favore, ditemi cosa c'è che non va.


 
Un errore di compilazione non necessario si verifica se la macro utilizza una conversione del tipo di risultato e il valore di ritorno non viene poi utilizzato (a volte è necessario, a volte no)
int g( int x ) { return ( x ); }

#define  F( X )    (long)g( X )

void OnStart()
{
        int f = F( 0 ); //нормально
        F( 0 );         //ошибка компиляции
}
 
A100:
Un errore di compilazione non necessario si verifica se una macro utilizza una conversione del tipo di risultato e il valore di ritorno non viene successivamente utilizzato (a volte è necessario, a volte no)

Questo non ha niente a che vedere con l'uso delle definizioni.

Anche una semplice definizione equivalente darà lo stesso errore

(long)g(0);


'(long)' - expression has no effect


P.S. Ora ci sarà un vorning qui.

 

Dopo aver ricompilato l'indicatore, l'errore "array out of range" ha iniziato a verificarsi quando si lavora con gli array dinamici.

Non è successo prima. Cosa fare?

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