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

 
Stanislav Korotky:

Имеется в виду перегрузка со ссылкой на объекты или ссылка на указатель (чего вроде не существует)? Я не в курсе, как в ссылку на объект подсунуть указатель на распределенный по new экземпляр.

со ссылкой на объекты.

у меня так:

class C {};

template<typename V>
void process(V value)
{
}

/* если добавить, компилируется
template<typename V>
void process(V& value)
{
}
*/

void process(C *ptr)
{
}
    
void OnStart()
  {
      C c;
      process(&c); // pointer, ok
      process(c); // 'process' - no one of the overloads can be applied to the function call       test2.mq5       32      7
  }
 
TheXpert:

со ссылкой на объекты.

у меня так:

Всё же не настолько прямолинейно, извиняйте ;-). Класс используется для наследования:

class BaseFunctor
{
  public:
    virtual void process() = 0;
};

class MyFunctor: public BaseFunctor
{
  public:
    virtual void process() override
    {
    }
};

template<typename V>
void process(V value)
{
}

void process(BaseFunctor *ptr)
{
}

void process(BaseFunctor &ref)
{
}

void OnStart()
{
  process(new MyFunctor()); // 'process' - ambiguous call to overloaded function, could be one of 3 function(s)
}

Если б можно было создавать BaseFunctor, он бы работал, да. Но это не тот случай.

 
Pavel Kozlov:

Здравствуйте!

Спасибо за сообщение об ошибке!

Не могли бы вы подробнее описать проблему с картинкой?

На текущий момент проблемы нет

 

Код ниже выводит 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

А должен вывести текст test

Файлы лежат в папке Files\\Test\\

Функция пишет что хендл верен он равен 1 и сразу GetLastError пишет ошибку 5008 Не верный хендл ....

Куда копать ?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   core();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
void core()
  {
   string value = "", name = "";

   name =  "Test" + "\\test.csv";
   Print(FileIsExist(name));

   ResetLastError();

   int m_hendle = -1;
   m_hendle = FileOpen(name, FILE_READ | FILE_WRITE | FILE_CSV);
   if(m_hendle != INVALID_HANDLE)
     {
      Print((string)m_hendle + "    " + name + " [" + (string)FileSize(m_hendle) + "]"+ (string)GetLastError());
       while(!FileIsEnding(m_hendle))
        {
         string sCurrent = FileReadString(m_hendle);
         Print("sCurrent = ", sCurrent);
        }
      FileClose(m_hendle);
     }
  }
//+------------------------------------------------------------------+
 
Sergey Dzyublik:
Очень противный баг MT5(build 2316), блокирующий дальнейшую разработку.
Создаешь сложный несколько раз обернутый объект с внутренним типом "С", а там оказывается совсем другой тип данных, может "B", может "int", что хочешь...

Убил уйму времени и сил, что бы раскопать и понять, что проблема не в коде, а в работе MQL компилятора. (С++ online: https://onlinegdb.com/H1R1fR5ML)
Предположительно, проблема в работе кеша шаблонного класса "main_wrapper" при генерации кода во время компиляции, когда в качестве параметра передается internal class "internal_wrapper" от шаблонного класса "A" для различных типов данных (int, B*, B, C).
Какой первый тип данных будет создан шаблонным классом "main_wrapper<A<TEMPLATE_TYPE>::internal_wrapper>, такой тип данных и будет далее использоваться во всех объектах, данного шаблона в будущем.


Другой баг с генераций кода шаблонного класса будет предоставлен ниже.

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

 
Vladimir Pastushak:

Код ниже выводит 牖漠摲牥⁳湩潦〉〮र〲थ⸰〰㠉┰〉〮र

А должен вывести текст test

Файлы лежат в папке Files\\Test\\

Функция пишет что хендл верен он равен 1 и сразу GetLastError пишет ошибку 5008 Не верный хендл ....

Куда копать ?

В какой кодировке файл?

 
Sergey Dzyublik:

Еще один баг MT5(build 2316) с генерацией кода шаблонного класса при использовании internal class.
С++ online: https://onlinegdb.com/HJkKXAqMU

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

 
Sergey Dzyublik:

Баг MT5(build 2340)  Ошибка компиляции при попытке доступа к internal class для шаблонного параметра шаблонной функции.

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

 
Ilyas:

В какой кодировке файл?

В стандартной UTF-8

Я пробовал по разному, с разными кодировками и с разными разделителями.

Результат либо 5008 либо иероглифы.

 
Sergey Dzyublik:

Сразу два вопроса к работе компилятора МТ5(build 2321):

1. Не соответствие приоритетов выполнения шаблонных функций в MQL в сравнении с шаблонными функциями в С++ (online: https://onlinegdb.com/Hkvz8Hu7L).
Так в С++, когда все три шаблонных функции в наличии, выполняется шаблонная функция с результатом "C++:1", если ее удалить, тогда выполнятся будет "C++:2", а если ее удалить - "C++:3".
В MQL же совсем другие приоритеты: "C++:2", затем "C++:1" и "C++:3".


2. Не понятно почему в MQL первая из функций запрещена, тогда как идентичная ей, но с фиктивным параметром, уже разрешена:

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