Errores, fallos, preguntas - página 2258

 
Anatoli Kazharski:

Es necesario poder seguir los cambios en las propiedades de todos los gráficos, no sólo de aquel en el que se encuentra el programa MQL.

Hacer una muleta a través de un temporizador.

 
fxsaber:

Hacer una muleta a través del temporizador.

No quiero hacer una muleta. Los desarrolladores de MQ pueden ampliar las posibilidades.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

Anatoli Kazharski, 2018.08.20 08:11

Quiero poder rastrear los cambios en las propiedades de todos los gráficos, no sólo de aquel en el que está colocado el programa MQL.

Ahora mismo el eventoCHARTEVENT_CHART_CHANGE no contiene ningún otro parámetro:

Evento

Valor del parámetro id

valor del parámetro lparam

valor del parámetro dparam

Valor del parámetro sparam

El evento de cambiar las dimensiones del gráfico o cambiar las propiedades del gráfico a través del diálogo de propiedades

CHARTEVENT_CHART_CHANGE

-

-

-

//---

Para seguir este evento en otros gráficos abiertos, se podría habilitar la supervisión especificando el ID del gráfico deseado.

Por ejemplo, así:

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


Como lparam-parámetro podría ser el identificador del gráfico en el que se realizaron los cambios. El parámetro sparam podría ser el nombre del símbolo.

 
A100:

Error durante la ejecución:

Resultado: esperado:

A::f<int>:1 A::f<int>:1
A::f<int>:753790661 A::f<int>:2
A::f<int>:Error:4007

Por lo demás:

Bien. ¿Cuál es la diferencia? ¿Por qué el tamaño del array se ha convertido de repente en 753790660 (en lugar de uno) y como consecuencia se ha agotado la memoria (4007)? MT5\1881\32

Además... si elimina literalmente tres caracteres de la clase en el primer caso, el resultado también será correcto

Gracias por el mensaje.

Arreglado.


Para que funcione en la compilación actual, no especifique el scop de la clase al declarar sus métodos.


Los demás informes de errores están relacionados con éste y no se reproducirán una vez que se realicen las correcciones.

 

el ejemplo de la ayuda no funciona:

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

el ejemplo en la parte inferior de la página no funciona, de las palabras:

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

el compilador escribe:

no se puede devolver el objeto 'CMatrix', no se encuentra el constructor de copia 'CMatrix::CMatrix(const CMatrix &)' tst.mq5 244 14

no se puede devolver el objeto 'CMatrix', no se encuentra el constructor de copia 'CMatrix::CMatrix(const CMatrix &)' tst.mq5 261 11

no se puede devolver el objeto 'CMatrix', no se encuentra el constructor de copia 'CMatrix::CMatrix(const CMatrix &)' tst.mq5 281 14

no se puede devolver el objeto 'CMatrix', no se encuentra el constructor de copia 'CMatrix::CMatrix(const CMatrix &)' tst.mq5 303 11

4 error(es), 0 advertencia(s) 5 1




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

Error de compilación (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;
}

Y así:

void OnStart()
{
        B<int> *b;
        A<int> *a;
}
bien. ¿Qué diferencia hay?
 
fxsaber:

Esta no es la razón.

esto ayuda mucho al leer el código y ayuda a evitar errores en algunas situaciones.

Tenga en cuenta que esto en MQL no funciona en todas partes:

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 en C++ se compila sin error

 
A100:

Tenga en cuenta que esto en MQL no funciona en todas partes:

que en C++ compila sin error

El C++ tiene un don para la perversión. Tal vez en algún lugar de las macros esto podría ser utilizado, pero no directamente.

 
En la esquina superior derecha sigo viendo un icono que dice que tengo MPs sin leer. No hay manera de restablecerlo - se lee. Por favor, añada un botón de "Hacer que todos lean".
 
fxsaber:

Puede ser posible usar esto en algún lugar de las macros, pero no directamente.

Las macros no tienen nada que ver con esto - sustituye esto por un puntero normal y tendrás exactamente la misma sintaxis:

struct A {
        int x;
};
struct B : A {
        int x;
};
void OnStart()
{
        B b;
        b.A::x = 1; //Error: '::' - syntax error
}
En MQL no se puede hacer referencia explícita a b.A::x, mientras que en C++ sí se puede. ¿Por qué esta restricción?
 
A100:

Las macros no tienen nada que ver con esto: sustituye esto por un puntero ordinario y tendrás exactamente la misma sintaxis:

En este caso está justificado. La variante con esto - no está claro por qué escribirlo así. Cuando A:: ya lo dice todo.