Erros, bugs, perguntas - página 1087

 

A notação abreviada do operador postfix++ não é compilada quando uma conversão explícita de um ponteiro de classe base para um derivado

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)++;               //ошибка
}
 
Pelo menos o compilador deve avisar que a.f() não é constante
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:
Pelo menos o compilador deve avisar que a.f() não é constante
Obrigado pela sua diligência, ambos os erros foram corrigidos.
 
mql5:
Obrigado pelo aviso, ambos os erros foram corrigidos.
Apenas o último não é tecnicamente um erro - apenas um aviso deve ser. É apenas um erro se
class B {
public:
        A * const a;
};

Mas nos modelos. Dar-vos-ei exemplos mais tarde.

 

Aqui também - não é claro.

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 );
}

tudo funciona correctamente, mas se acrescentar a função intermédia 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 );
}

O resultado é diferente. O que fez o ex2(...) ? - acabou de passar as indicações por referência em

Por favor, dê uma olhada em

 
A100:

Aqui também - não é claro.

tudo funciona correctamente, mas se acrescentar a função intermédia ex2(...)

O resultado é diferente. O que fez o ex2(...) ? - acabou de passar as indicações por referência em

Por favor, dê uma olhada em

Obrigado, erro de optimização da linguagem, corrigido.
 

Não é a primeira vez, mas é a única vez que recebe tais fotografias quando carrega, o que significa que tem de estabelecer alguns critérios (provavelmente tem um certo tamanho).
). São expostos normalmente em qualquer outro lugar. Por favor, diga-me o que está errado.


 
Ocorre um erro de compilação desnecessário se a macro usar uma conversão de tipo de resultado e o valor de retorno não for então usado (às vezes é necessário, às vezes não é)
int g( int x ) { return ( x ); }

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

void OnStart()
{
        int f = F( 0 ); //нормально
        F( 0 );         //ошибка компиляции
}
 
A100:
Um erro de compilação desnecessário ocorre se uma macro utiliza uma conversão de tipo de resultado, e o valor de retorno não é subsequentemente utilizado (às vezes é necessário, às vezes não)

Isto não tem nada a ver com a utilização de definições.

Uma simples definição equivalente dará também o mesmo erro

(long)g(0);


'(long)' - expression has no effect


P.S. Agora vai haver aqui um vorning.

 

Após recompilar o indicador, o erro "array out of range" começou a ocorrer quando se trabalhava com matrizes dinâmicas.

Não ocorreu antes. O que fazer?

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