Ошибки, баги, вопросы - страница 2258

 
Anatoli Kazharski:

Нужна возможность отслеживать изменения свойств всех графиков, а не только того, на котором размещена MQL-программа.

Сделайте костыль через таймер.

 
fxsaber:

Сделайте костыль через таймер.

Не хочется делать костыль. Разработчики MQ могут расширить возможности.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Anatoli Kazharski, 2018.08.20 08:11

Нужна возможность отслеживать изменения свойств всех графиков, а не только того, на котором размещена MQL-программа.

Сейчас событие CHARTEVENT_CHART_CHANGE не содержит никаких других параметров:

Событие

Значение параметра id

Значение параметра lparam

Значение параметра dparam

Значение параметра  sparam

Событие изменения размеров графика или изменения свойств графика через диалог свойств

CHARTEVENT_CHART_CHANGE

//---

Для отслеживания этого события на других открытых графиках можно было бы включать мониторинг, указав идентификатор нужного графика.

Например, вот так:

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


В качестве lparam-параметра может быть идентификатор графика, на котором были изменения. В качестве sparam-параметра название символа.

 
A100:

Ошибка при выполнении:

Результат:                         Ожидалось:

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

А так:

нормально. А какая разница? С чего вдруг размер массива стал равен 753790660 (вместо единицы) и как следствие память вдруг закончилась (4007) ? MT5\1881\32

Более того... если в первом варианте удалить в классе буквально три символа - результат также будет нормальным

Спасибо за сообщение.

Исправлено.


Для работы в текущем билде не указывайте скоп класса при объявлении его методов.


Сообщения об остальных ошибках связаны с этой и после внесённых исправлений не воспроизводятся.

 

пример из справки не работает:

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

не работает пример в самом низу страницы, со слов:

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

компилятор пишет:

object of 'CMatrix' cannot be returned, copy constructor 'CMatrix::CMatrix(const CMatrix &)' not found tst.mq5 244 14

object of 'CMatrix' cannot be returned, copy constructor 'CMatrix::CMatrix(const CMatrix &)' not found tst.mq5 261 11

object of 'CMatrix' cannot be returned, copy constructor 'CMatrix::CMatrix(const CMatrix &)' not found tst.mq5 281 14

object of 'CMatrix' cannot be returned, copy constructor 'CMatrix::CMatrix(const CMatrix &)' not found tst.mq5 303 11

4 error(s), 0 warning(s) 5 1




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

Ошибка при компиляции (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;
}

А так:

void OnStart()
{
        B<int> *b;
        A<int> *a;
}
нормально. А какая разница?
 
fxsaber:

Это не причина.

this сильно помогает при чтении кода и помогает избегать ошибок в некоторых ситуациях.

Замечу что this в MQL не везде работает:

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

что в С++ компилируется без ошибки

 
A100:

Замечу что this в MQL не везде работает:

что в С++ компилируется без ошибки

В C++ знают толк в извращениях. Возможно, где-то в макросах такое может быть использовано, но не напрямую.

 
В правом-верхнем углу все время висит значок, что у меня непрочитанные ЛС. Сбросить никак не получается - прочитал. Просьба добавить кнопку "Сделать все прочитанным".
 
fxsaber:

Возможно, где-то в макросах такое может быть использовано, но не напрямую.

Макросы тут совершенно ни при чем - замените this на обычный указатель и будет точно такой же синтаксис:

struct A {
        int x;
};
struct B : A {
        int x;
};
void OnStart()
{
        B b;
        b.A::x = 1; //Error: '::' - syntax error
}
В MQL нельзя явно обратиться к b.A::x, а в С++ можно. К чему такое ограничение?
 
A100:

Макросы тут совершенно ни при чем - замените this на обычный указатель и будет точно такой же синтаксис:

В данном случае оправдано. Вариант с this - не ясно, зачем так писать. Когда A:: и так обо всем говорит.

Причина обращения: