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

 

На графике (в частности EURUSD) с месячным и недельным таймфреймом перекрестие очень медленно двигается вслед за курсором - для воспроизведения достаточно плавно перемещать курсор по диагонали. На остальных таймфреймах - нормально. Ранее такой задержки не было


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

Результат:   1-2-2-0-0-0

Ожидалось: 1-2-0-0

как в C++. Кроме того ожидался единый синтаксис: приведение - это приведение, а не вызов конструктора

Да вроде всё верно. Просто наверное там ещё вызывается конструктор перемещения, который в MQL заменяется копированием.
А приведение - это ж вроде (A)a1
 
Alexey Navoykov:
Да вроде всё верно, мне кажется. Просто наверно там ещё вызывается конструктор перемещения, который в MQL заменяется копированием.
А приведение - это ж вроде (A)a1

(А)а1 или А(а1) приведение типов А а1 не приведение, а объявление типа вроде в доках. Хотя счас со скобками че то не то происходит. Единый формат нужен для языка.

 
Valeriy Yastremskiy:

(А)а1 или А(а1) приведение типов А а1 не приведение, а объявление типа вроде в доках. Хотя счас со скобками че то не то происходит. Единый формат нужен для языка.

Тут отличие в том, что в плюсах (A)a1 означает приведение копии объекта. А в MQL - приведение ссылки.  Из-за этого можно огрести проблемы с совместимостью.
Я давно просил их сделать приведение сыылки как в плюсах:  (A&)a1,  но теперь уже наверно вряд ли будут что-то менять.
 
Alexey Navoykov:
Тут отличие в том, что в плюсах (A)a1 означает приведение копии объекта. А в MQL - приведение ссылки.  Из-за этого можно огрести проблемы с совместимостью.
Я давно просил их сделать приведение сыылки как в плюсах:  (A&)a1,  но теперь уже наверно вряд ли будут что-то менять.

Не си не питон) что то между. Спс, не знал, полагал, что приведение типа объекта. Экономия.)

 
Alexey Navoykov:
Да вроде всё верно. Просто наверное там ещё вызывается конструктор перемещения, который в MQL заменяется копированием.
А приведение - это ж вроде (A)a1

Сомневаюсь что все верно, потому что допустим:

class A {
public:
        virtual void f() { Print( 1 ); }
};
class B : public A {
public:
        virtual void g() { ((A)this).f(); }
};
class C : public B {
public:
        virtual void f() { Print( 3 ); }
};
void OnStart()
{
        B *b = new C;
        b.g();
}

Результат в MQL: 3

, а            в C++: 1

В любом случае пусть проверят

 
A100:

Сомневаюсь что все верно, потому что допустим:

Результат в MQL: 3

, а            в C++: 1

В любом случае пусть проверят

Так это как-раз именно та ситуация, которую я описал чуть выше.
 
A100:

Сомневаюсь что все верно, потому что допустим:

Результат в MQL: 3

, а            в C++: 1

В любом случае пусть проверят

Я бы не был таким однозначным при интерпретации MQL кода на С++.
Код для С++ (online: https://onlinegdb.com/Hy1FIj9Qv):

class A {
public:
        virtual void f() { printf( "1" ); }
};
class B : public A {
public:
        virtual void g_ptr() { ((A*)(this))->f(); }   //3
        virtual void g_ref() { ((A&)(*this)).f(); }   //3
        virtual void g_cast() { ((A)(*this)).f(); }   //1
};
class C : public B {
public:
        virtual void f() { printf( "3" ); }
};
void OnStart()
{
        B *b = new C;
        b->g_ptr();
        b->g_ref();
        b->g_cast();
}

int main()
{
    OnStart();
    return 0;
}
 
Sergey Dzyublik:

Я бы не был таким однозначным при интерпретации MQL кода на С++.
Код для С++ (online: https://onlinegdb.com/Hy1FIj9Qv):

И как предлагаете 3ий вариант g_cast записать на MQL ?

 
A100:

И как предлагаете 3ий вариант g_cast записать на MQL ?

Можно явно вызвать функцию из базового класса:

class A {
public:
        virtual void f() { Print( 1 ); }
};
class B : public A {
public:
        virtual void g() { this.A::f(); }   //1
};
class C : public B {
public:
        virtual void f() { Print( 3 ); }
};
void OnStart()
{
        B *b = new C;
        b.g();
}
Причина обращения: