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

 
Igor Makanu:

в прошлом году работало не так - специально тестировал модификаторы const

и кажется @Ilyas объяснял как происходит запуск MQL-программы, сначала инициализируются все const и static вне зависимости от того где они описаны, затем уже конструкторы классов будут вызваны

Видно речь шла о глобальных переменных с модификаторами const/static, а вы используете локальные.

 
Koldun Zloy:

Что конкретно Вы считаете ошибкой?

У меня VS2019 не выдаёт никаких ошибок.

ошибка, что компилятор MQL разрешает использовать неоднозначные выражения , если есть модификатор const то это константа

этот же код компилятор не отследил? а другую ситуацию отследил

Шарп в VS2019 сразу еще до компиляции все подчеркнул 

class A{
public:
   int ivalue;
   int inc()const {static int v = 0; return(++v);}
   A():ivalue(0){}
};

class B{
public:
   int ivalue;
   int inc(){return(++ivalue);}
   B():ivalue(0){}
};

//+------------------------------------------------------------------+
void OnStart()
{
   const A a;
   Print(a.inc());  
   B b1;
   Print(b1.inc());
   const B b2;
   Print(b2.inc()); // 'inc' - call non-const method for constant object
}
//+------------------------------------------------------------------+
Sergey Dzyublik:

Видно речь шла о глобальных переменных с модификаторами const/static, а вы используете локальные.

может быть и перепутал, но поведение модификатора const сильно отличается от C#

[Удален]  

Переменную объявленную с модификатором const нельзя изменять. Компилятор это отслеживает.

Вы видимо ожидаете от него что-то другое.

 
Koldun Zloy:

Вы видимо ожидаете от него что-то другое.

видимо да, ожидаю, что прыгая между MQL и C# все будет одинаково, ладно проехали

[Удален]  

Build 2366

namespace X
{

class A
{
public:
   A(){}
};

}  //  namespace X

class B : public X::A
{
public:
   B() : X::A()  //'X' - struct member undefined
   {
   }
};
 
Ilyas:

Спасибо за сообщение, проверю

mq5 - норм. mq4 - сломали. Можно взять TypeToBytes_ExampleScript.mq4 отсюда. Компилируется только в случае, если расширение поменять на mq5.

 

Здравствуйте, коллеги.

Возможно я не первый задаю этот вопрос. Писал в другую ветку, но ответа разработчиков не получил. Почему при реальной стоимости пункта на XAUUSD - 1USD

Функция SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE); упорно показывает 0.1USD

И как при этом считать просадку, прибыль, и прочие вещи, в то время как на валютных парах показывает нормальную стоимость тика.

З.Ы. Терминал МТ5

 
Andrey Kaunov:

Здравствуйте, коллеги.

Возможно я не первый задаю этот вопрос. Писал в другую ветку, но ответа разработчиков не получил. Почему при реальной стоимости пункта на XAUUSD - 1USD

Функция SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE); упорно показывает 0.1USD

И как при этом считать просадку, прибыль, и прочие вещи, в то время как на валютных парах показывает нормальную стоимость тика.

З.Ы. Терминал МТ5

Это Вы у своего брокера спрашивайте, эти данные заполняет брокер...

 
Баг MT5 (build 2366),  ошибка компиляции при доступе к статическому методу класса, доступ к которому осуществляется через шаблонный тип аргумента функции.

template<typename _Tp>
struct It_g{
   class Opt{
      template<typename _It>
      static void test(_It &it){               
         _Tp p = it.p;                  
      };
   };
   
   _Tp p;
};

template<typename _Tp>
class V{
public:
   struct It : public  It_g<_Tp>{};
   It b;
};


template<typename T>
class GetStructType{
public:
   struct type : public T{};
};

template<typename _It>
void test(_It &it){
   GetStructType<_It>::type::Opt::test(it);   // Ok
   
   _It::Opt opt;
   opt.test(it);                              // Ok
   
   _It::Opt::test(it);                        // '_It' is not a class, struct or union | 'Opt' is not a class, struct or union
}

class ClassA{};


void OnStart(){ 
   V<int> v1;
   test(v1.b);
   
   V<ClassA*> v2;
   test(v2.b);
   
   V<int>::It it3;
   test(it3);
   
   V<ClassA*>::It it4;
   test(it4);
}
 
Баг MT5 (build 2366),  ошибка компиляции из-за некоректного использования пространства имен и области видимости в шаблонном конструкторе при вызове базового класса.
Проблема возникает, когда используется одно и то же имя класса: в глобальном пространстве имен, в internal class и при наследовании в качестве базового класса.

template<typename T>
struct B{
   char data;
   
   B(){}
   B(int){}
};


template<typename T>
class A{
public:
   struct __reverse_iterator : public B<T>{
      __reverse_iterator() : B<T>(1){}                 // Ok
      
      template<typename TT>
      __reverse_iterator(const TT& n) : B<T>(n){}      //'<' - template mismatch
   };
   
   struct B : public __reverse_iterator{
      B() : __reverse_iterator(){}
      B(int n) : __reverse_iterator(n){}
   };
};

   
void OnStart(){  
   A<int>::B it_1();      // Ok
   A<int>::B it_2(1);     // Compile Error
}


В С++ все работает, если явно сослаться на глобальное пространство имен. С++ online: https://onlinegdb.com/BJIV6frUI
В MQL этого сделать нельзя - Compile Error, баг при определении internal class - отсутствует возможность явно сослаться на глобальное пространство имен при указании базового класса. (не исправлено  MT5(build 2366))   

Так же проблем в конструкторе при вызове базового класса касается представленный ранее баг - https://www.mql5.com/ru/forum/1111/page2680#comment_15546487
Прошу обратить внимание, что он "работает" как при использовании пространства имен, так и с internal классами.