Erros, bugs, perguntas - página 2258

 
Anatoli Kazharski:

É preciso ser capaz de acompanhar as alterações nas propriedades de todos os gráficos, e não apenas aquele em que o programa MQL é colocado.

Fazer uma muleta através de um temporizador.

 
fxsaber:

Fazer uma muleta através do temporizador.

Não se quer fazer uma muleta. Os programadores do MQ podem expandir as possibilidades.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Insectos, insectos, perguntas

Anatoli Kazharski, 2018.08.20 08:11

Quero ser capaz de acompanhar as alterações nas propriedades de todos os gráficos, não apenas aquele em que o programa MQL é colocado.

Neste momento, o eventoCHARTEVENT_CHART_CHANGE não contém quaisquer outros parâmetros:

Evento

Valor do parâmetro id

valor do parâmetro lparam

valor do parâmetro dparam

Parâmetro valor sparam

O evento de alteração das dimensões do gráfico ou a alteração das propriedades do gráfico através do diálogo de propriedades

CHARTEVENT_CHART_CHART_CHANGE

-

-

-

//---

Para acompanhar este evento em outros gráficos abertos, a monitorização poderia ser activada especificando a identificação do gráfico desejado.

Por exemplo, como este:

ChartSetInteger(chart_id,CHART_EVENT_CHART_CHANGE,true);
//---


Como lparam-parameter poderia ser o identificador do gráfico em que foram feitas as alterações. O parâmetro sparam poderia ser o nome do símbolo.

 
A100:

Erro durante a execução:

Resultado: Esperado:

R::f<int>:1 A::f<int>:1
A::f<int>:753790661 A::f<int>:2
R::f<int>:Erro:4007

Caso contrário:

Muito bem. Qual é a diferença? Porque é que o tamanho da matriz se tornou subitamente 753790660 (em vez de um) e, como consequência, a memória ficou subitamente esgotada (4007) ? MT5\1881\32

Além disso... se eliminar literalmente três caracteres da classe no primeiro caso, o resultado também será ok

Obrigado pela mensagem.

Fixo.


Para trabalhar na construção actual, não especificar o escopo de classe ao declarar os seus métodos.


Outros relatórios de bugs estão relacionados com este e não serão reproduzidos após as correcções terem sido feitas.

 

o exemplo da ajuda não funciona:

https://www.mql5.com/ru/docs/basis/function/operationoverload

o exemplo no fundo da página não funciona, a partir das palavras:

Другой пример перегрузки операции индексирования - работа с матрицами. Матрица представляет собою двумерный динамический массив, размеры массивов заранее неопределены. Поэтому нельзя объявить массив вида array[][] без указания размера второго измерения и затем передавать этот массив в качестве параметра. Выходом может служить специальный класс CMatrix, который содержит в себе массив объектов класса CRow.

o compilador escreve:

objecto de 'CMatrix' não pode ser devolvido, o construtor de cópias 'CMatrix::CMatrix(const CMatrix &)' não foi encontrado tst.mq5 244 14

objecto de 'CMatrix' não pode ser devolvido, o construtor de cópias 'CMatrix::CMatrix(const CMatrix &)' não foi encontrado tst.mq5 261 11

objecto de 'CMatrix' não pode ser devolvido, o construtor de cópias 'CMatrix::CMatrix(const CMatrix &)' não foi encontrado tst.mq5 281 14

objecto de 'CMatrix' não pode ser devolvido, o construtor de cópias 'CMatrix::CMatrix(const CMatrix &)' não foi encontrado tst.mq5 303 11

4 erro(s), 0 aviso(s) 5 1




Документация по MQL5: Основы языка / Функции / Перегрузка операций
Документация по MQL5: Основы языка / Функции / Перегрузка операций
  • www.mql5.com
Перегрузка операций позволяет использовать операционную нотацию (запись в виде простых выражений) к сложным объектам - структурам и классам. Запись выражений с использованием перегруженных операций упрощает восприятие исходного кода, так как более сложная реализация сокрыта. Для примера рассмотрим широко применяемые в математике комплексные...
 

Erro de compilação (ME\1881\32)

template<typename T>
class B;
template<typename T>
class A {
        B<int> *f() { return NULL; }
};
template<typename T>
class B : public A<T> {}; //Error: 'A' - struct undefined
void OnStart()
{
        A<int> *a;
        B<int> *b;
}

E assim:

void OnStart()
{
        B<int> *b;
        A<int> *a;
}
muito bem. Que diferença é que isso faz?
 
fxsaber:

Esta não é a razão.

isto ajuda muito na leitura do código e ajuda a evitar erros em algumas situações.

Note-se que isto em MQL não funciona em todo o lado:

class A { protected:
        int a;
};
class B : public A {
        int a;
        void f1() { this.a    = 0; } //нормально
        void f2() { this.A::a = 0; } //Error: '::' - syntax error
};

que em C++ compila sem erros

 
A100:

Note-se que isto em MQL não funciona em todo o lado:

que em C++ compila sem erros

O C++ tem um dom para a perversão. Talvez algures nas macros isto pudesse ser utilizado, mas não directamente.

 
No canto superior direito continuo a ver um ícone a dizer que tenho PMs por ler. Não há maneira de o reiniciar - lê-se. Por favor adicionar um botão "Make all read".
 
fxsaber:

Pode ser possível utilizar isto algures em macros, mas não directamente.

As macros não têm nada a ver com isto - substitua isto por um ponteiro normal e tem exactamente a mesma sintaxe:

struct A {
        int x;
};
struct B : A {
        int x;
};
void OnStart()
{
        B b;
        b.A::x = 1; //Error: '::' - syntax error
}
Em MQL não se pode referir explicitamente a b.A::x, enquanto em C++ pode. Porquê uma tal restrição?
 
A100:

As macros não têm nada a ver com isto - substitua isto por um ponteiro comum e tem exactamente a mesma sintaxe:

Neste caso, é justificado. A variante com isto - não é claro porquê escrevê-la dessa forma. Quando A:: já diz tudo.