Erros, bugs, perguntas - página 1172

 

Existem erros na biblioteca padrão para MQL4, especificamente nas classes indicadoras.

Para a classe CiATR falta o corpo do método GetData.

Para indicadores que utilizam parâmetros do tipo ENUM_APPLIED_VOLUME(CiForce, CiOBV) existe um erro: não é possível utilizar um enumerador inadequado

A propósito, ENUM_APPLIED_VOLUME parece ser uma enumeração padrão; está presente na documentação MQL4, mas de facto está ausente ('ENUM_APPLIED_VOLUME' - identificador não declarado).

Portanto, por favor, verifique todas as suas bibliotecas. Tenho a sensação de que foram apressadamente transportados do MT5 sem sequer verificarem a sua funcionalidade.

 

Compilar erro, construir 966

#property library
#define  CLR     C'255,255,255'//White

class A {
        A() { clr = CLR; }
        color clr;
};
build 932 está bem
 
A100:
Após substituição directa, o código não é compilado devido ao comentário
 

depende do conteúdo do comentário

#define  CLR     C'255,255,255'//не White

está bem

 
Bem, não deve compilar de qualquer forma )
 

Os comentários nunca são substituídos - o compilador simplesmente ignora-os, caso contrário #define na maioria dos casos não poderia ser usado com comentários //

#define  ONE 1 //один
#define  TWO 2 //два

int a = ONE + TWO;
приводит к int a = 1 + 2;
а не к int a = 1 //один + 2 //два;
Em qualquer caso, substitua // por /**/ em https://www.mql5.com/ru/forum/1111/page1190#comment_993854
#define  CLR     C'255,255,255'/*White*/

O resultado é o mesmo - erro de compilação.

 
Anteriormente, na página de perfil de outra pessoa era possível mudar para o News Feed (desse utilizador) através de um link. Agora não vejo tal link, mas se eu adicionar /news no final do URL, esta página abre normalmente. É um erro o facto de a ligação ter desaparecido da IU?
 
marketeer:
Por favor, explique a seguinte situação. Tenho um indicador multi-moeda, cujos valores não mudam dependendo do gráfico a que está anexado - calcula os valores para os instrumentos especificados e não está relacionado com a janela actual. Desenho manualmente linhas de apoio e resistência sobre este indicador. Agora o truque: se eu arrastar outra ferramenta da visão geral do mercado para a janela, a aparência do indicador permanece a mesma e as linhas desaparecem. Se abrir a caixa de diálogo da Lista de Objectos, esses objectos continuam lá listados. Os valores finais (datas e valores) permanecem os mesmos (ou seja, devem ser visíveis nos mesmos locais) - é compreensível, eles não foram alterados. No entanto, as linhas não são visíveis. Se depois arrastar a ferramenta anterior que estava originalmente na janela, as linhas tornam-se novamente visíveis. Qual é o problema?

Encontrado e corrigido.

Obrigado por me contactarem. Acontece que é um bug genérico - sempre funcionou assim antes

 

Não pode aplicar o operador abreviado !() - erro de compilação

class A {
public:
        bool operator !() { return ( false ); }
};

bool f1( A* a ) { return ( f3( a ) ); }
bool f2( A* a ) { return ( !a ); }             //ошибка компиляции
bool f3( A* a ) { return ( a.operator!() ); }  //нормально
bool f4( A& a ) { return ( !a ); }

void OnStart()
{
        A *a = new A;
        Print( f1( a ));
        Print( f4( a ));
}

Se o compilador compreende (e compreende) que f4( a ) significa "a" é um objecto e não um ponteiro/scriptor como um número)

deve também compreender que !a' significa a mesma coisa para 'a' (objecto, não ponteiro/numérico)

por outras palavras, se

class A {
    void f() {}

void OnStart()
{
        A a1;
        A *a2 = new A;
        a1.f();
        a2.f();
}
a1.f() e a2.f() significam a mesma coisa, quer a1, a2 seja um ponteiro ou um objecto, como é que o operador !() é pior?
 

Devo acrescentar que, por exemplo, não existe erro de compilação com operator+(), nem existe se simplesmente adicionarmos operator+(), que não é de todo utilizado, ao primeiro exemplo acima

class A {
public:
        bool operator !() { return ( false ); }
        bool operator +() { return ( false ); }
};
mas, neste caso, ocorre outra incerteza
class A {
public:
        bool operator !() { return ( true ); }
        bool operator +() { return ( true ); }
};

int g( A& a )  { return ( 10 ); }
int g( int )   { return ( 20 ); }

void OnStart()
{
        A *a = new A;
        Print( !a );            //здесь    считает                 'a' - числом ???
        Print( a.operator!() ); //здесь не считает (что правильно) 'a' - числом
        Print( g( a ) );        //здесь не считает (что правильно) 'a' - числом, хотя есть g( int ) и нет g( A* )
}