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

 
Подскажите, есть ли возможность определить, работает эксперт в режиме оптимизации или одиночного тестирования?
 
MT5 (build 2059)
Ошибка компиляции при передаче в шаблонную функцию параметра  (void*)(NULL):
class C{
public:
   template<typename T>
   static void func(T ){
      Print(__FUNCSIG__);
   }
};


void OnStart(){  
   void* c_ptr = new C();
   
   C::func((C*)NULL);     // Ok
   C::func(c_ptr);        // Ok
   C::func((void*)NULL);  // 'void' - illegal use of 'void' type
   
   delete c_ptr;
}
Все работало в (build 2057), возможно что-то поламалось в рамках исправления:
  и   "Ошибка компиляции при выполнении type cast "самого в себя" для шаблонных классов и "сложных" структур".
 
Возможно по аналогии с С++ имеет смысл ввести "полноценный" нулевой указатель - nullptr ?
 

Еще в build 2056 все работало нормально. А в 2059 - уже ошибка при компиляции:

void OnStart()
{
class A {};
//#define void  A //(*)
        const void *p1;
              void *p2 = (void *)p1; //Error: 'void' - class type expected
}

А если void заменить на A (*), то все нормально. А какая разница?

Более того - ошибка при компиляции возникает даже в этом случае:

              void *p2 = (void *)p1; //Error: 'void' - class type expected
 

При компиляции в командном build 2059x32 абстрактная ошибка:

но через IDE не воспроизводится - может и случайность

 
A100:

Как делаете выбор между использованием шаблонов и void* ?

 
fxsaber:

Как делаете выбор между использованием шаблонов и void* ?

Какого то особого подхода нет, как то само собой выбирается на уровне интуиции

 
К сожалению, на текущий момент возможности указателей на функции (function pointer types) в МТ4/MT5 весьма ограничены и не практичны из-за ряда дефектов:
 (не исправлено в MT5(build 2060)) "Ошибка компиляции при повторном использовании одной и той же сигнатуры функции в рамках typedef".
 (не исправлено в MT5(build 2060))  "При работе с typedef использование шаблонной функции с явной специализацией не вызывает генерацию кода этой шаблонной функции".


В виду ожидаемого внедрения пространства имен, прошу в рамках исправлений дефектов рассмотреть возможность внедрения поддержки следующего С++ подобного поведения:
//#include <iostream>

template<typename T>
class A{
public:
    typedef void (*callback)(T&);   //class namespace for function pointer type
    callback f_ptr;
    T data;
};

template<typename T>
class B{
public:
    typedef void (*callback)(T&);   //class namespace for function pointer type
    callback f_ptr;
};

template<typename T>
void func(T& value){
    ++value;
}


void OnStart(){
//int main(){
    A<int> a;
    B<int> b;
    
    a.f_ptr = func<int>;      // automatic code generation of templates functions
    b.f_ptr = a.f_ptr;        // assignment operation for function pointers with the same function signatures and different function pointer types.
    
    int x = 1;
    b.f_ptr(x);
    printf("%d\r\n", x);                  //2
    printf("%d\r\n", b.f_ptr == a.f_ptr); //1     // equal operation for function pointers with the same function signatures and different function pointer types.
}
 

Привет! Обратите внимание на тему пожалуйста

https://www.mql5.com/ru/forum/314275

В двух словах, тестер расчитывает маржу, не соответствующую заданной в настройках символа
[bug] Неправильная Margin при тестировании на custom symbol
[bug] Неправильная Margin при тестировании на custom symbol
  • 2019.05.25
  • www.mql5.com
Привет! Создал кастомный символ с параметрами, скопированными из реального Si-3.19. См. скриншоты. Загрузил для него историю...
 

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

Новая версия платформы MetaTrader 4 build 1170

fxsaber, 2019.05.28 12:10

Это ошибка MT4-компилятора?
#property strict

void Func( int &[] ) {}
void Func( int &[][2] ) {} // 'Func' - function already defined and has body

void OnStart()
{
  int Array1[];
  int Array2[][2];
  
  Func(Array1);
  Func(Array2); // 'Array2' - invalid array access
}


В MT5 с этим нет проблем. В MT4 никак не получается перегрузить функцию.