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

 
Artyom Trishkin:
Переназначая указатель на новый объект, теряем предыдущий объект, на который указывал переназначенный указатель . 

нет, указатель это указатель, в MQL он дескриптор, не суть - но новую копию обьекта создавать не корректно это, вот так сейчас работает корректно:

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <ChartObjects\ChartObjectsTxtControls.mqh>
CChartObjectLabel *LabelUP,*LabelDN;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   LabelUP=new CChartObjectLabel;
   LabelDN=new CChartObjectLabel;
   SetLabel(LabelUP,"LabelUP",0);
   SetLabel(LabelDN,"LabelDN",25);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete LabelUP;
   delete LabelDN;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);

  }
//+------------------------------------------------------------------+
void SetLabel(CChartObjectLabel *l,string name,int y)
  {
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }
//+------------------------------------------------------------------+

но если следовать твоей логике, то и в этом коде будет создана копия обьекта l в ф-ции SetLabel() -  я же указатель передал, а не ссылку?


Artyom Trishkin:
new надо убирать. Объекты же есть уже, и указатели на них. 

вопрос не как решить проблему, а почему при глобальной области видимости переменной CChartObjectLabel *LabelUP,*LabelDN; - потерялся указатель!

 
Igor Makanu:

нет, указатель это указатель, в MQL он дескриптор, не суть - но новую копию обьекта создавать не корректно это, вот так сейчас работает корректно:

но если следовать твоей логике, то и в этом коде будет создана копия обьекта l в ф-ции SetLabel() -  я же указатель передал, а не ссылку?

Нет. Здесь l - параметр метода, через который передаем нужный указатель. Здесь всё хорошо. Здесь указатель остаётся на ранее созданный объект. Тут же нет создания нового объекта и переназначение указателя на него с потерей прошлого объекта.
 
Artyom Trishkin:
Нет. Здесь l - параметр метода, через который передаем нужный указатель. Здесь всё хорошо. Здесь указатель остаётся на ранее созданный объект. Тут же нет создания нового объекта и переназначение указателя на него с потерей прошлого объекта.

все равно не корректно все работает

вот эти "указатели" в MQL заточены под работу в области видимости класса, я не хочу создавать класс, беру и объявляю в глобальной видимости указатель, затем передаю его в любую ф-цию и то что в этой ф-ции я создаю дескриптор обьекта не есть повод уничтожать обьект при выходе из локальной видимости ф-ции 

сейчас немного занят, но нужно тестовые примеры без графики сделать - думаю такая же беда будет, что если вошел в ф-цию с указателем со значением POINTER_INVALID, то и выйдешь с таким же POINTER_INVALID , по ссылке да, все будет работать корректно, но вроде по ссылке нельзя передать указатель с POINTER_INVALID - будет ошибка обращения к указателю

 
Igor Makanu:

все равно не корректно все работает

вот эти "указатели" в MQL заточены под работу в области видимости класса, я не хочу создавать класс, буру и объявляю в глобальной видимости указатель, затем передаю его в любую ф-цию и то что в этой ф-ции я создаю дескриптор обьекта не есть повод уничтожать обьект при выходе из локальной видимости ф-ции 

сейчас немного занят, но нужно тестовые примеры без графики сделать - думаю такая же беда будет, что если вошел в ф-цию с указателем со значением POINTER_INVALID, то и выйдешь с таким же POINTER_INVALID , по ссылке да, все будет работать корректно, но вроде по ссылке нельзя передать указатель с POINTER_INVALID - будет ошибка обращения к указателю

Как раз объект не уничтожается. Просто после создания нового объекта внутри метода, имеем уже два объекта. А указатель-то один - в метод он был  передан формальным параметром. Таким образом теряем указатель на один из объектов.
 

С удивлением обнаружил возможность объявления typedef с указателем на шаблонную функцию.
Однако счастье не оказалось долгим.

template<typename T>
typedef bool (* callback)(T &);

template<typename T>
bool ff(T &){
   return true;
}

bool ff(int &){
   return true;
}


void OnStart(){
   int a;
   ff(a);
   
   callback<int> f_ptr_0 = ff;     //'<' - unexpected token     
   callback f_ptr_1 = ff;          //'ff' - function must have a body   
   callback f_ptr_2 = ff<int>;     //'ff<int>' - cannot resolve function address  //'ff<int>' - type mismatch   
}


 typedef с указателем на шаблонную функцию является ли запланированным  к использованию функционалом?

 
Еще один баг в огород typedef:
typedef void (* callback)(int &);

template<typename T>
void ff(T &){}


void OnStart(){
   int a = 0;
   //ff(a);                     //  если раскомментировать, то работает
   
   callback f_ptr = ff<int>;    //  'ff<int>' - function must have a body
   f_ptr(a);
}

При работе с typedef использование шаблонной функции с явной специализацией не вызывает генерацию кода этой шаблонной
 

Создаю кастомный символ и заполняю его дневными барами за 25 лет, это должно весить примерно 400 кб.  Однако в папке символа создаются .hcc файлы суммарным размером 15 мб!  И вдобавок всё это занимает около 20 секунд!  Ни в какие ворота не лезет...  Как это можно объяснить?

 
Sergey Dzyublik:

С удивлением обнаружил возможность объявления typedef с указателем на шаблонную функцию.
Однако счастье не оказалось долгим.

О чем я и говорил
 

За последнее время предоставлено информацию о десятке "особенностей" работы и багов в МТ.
Как узнать стоит ждать их исправление или нет?
Прошу не предлагать тестить все каждый раз при выходе нового билда.

 (не исправлено в MT5(build 2057)) "Тестер стратегий: запланировано 2 прохода, но на практике бесконечное число проходов > 900шт из-за ошибки "OnInit critical error"".
 (не исправлено в MT5(build 2057))  "Некорректное значение поля размер массива в рамках работы дефолтного оператора присваивания для структур с динамическими массивами".
 (не исправлено в MT5(build 2057))  "Компилятор не видит дефолтный конструктор копирования для класса при возвращении объекта класса по значению из функции".
  и  (не исправлено в MT5(build 2057))  "Ошибка компиляции при выполнении type cast "самого в себя" для шаблонных классов и "сложных" структур".
 (не исправлено в MT5(build 2057))  "При работе с typedef использование шаблонной функции с явной специализацией не вызывает генерацию кода этой шаблонной функции".
 (не исправлено в MT5(build 2057)) "Ошибка компиляции при повторном использовании одной и той же сигнатуры функции в рамках typedef".
 (не исправлено в MT5(build 2057))  "Значительная часть функций для работы со строками не работает с NULL символами в строке (например: ShortArrayToString, StringInit, StringFill)".
 (не исправлено в MT5(build 2057))  "Функция StringSetLength работает только в сторону "обрезания" длины строки, но не увеличения".
 (исправлено в MT5(build 2057)) "Тестер стратегий: запуск 750 процессов "metatester64.exe"".
 "Форум www.mql5.com, при правке сообщения с картинкой, предыдущая картинка не заменяется на новую".


Предложения:
 "Предоставить пользователю возможность принудительной генерации/удаления кода для оператора присвоения (конструктор копирования) по умолчанию".
 "Разрешить функции ArrayCopy копировать классы и "сложные" структуры, аналогично тому как структуры предоставляют функционал deep copy для любого типа объекта".
 "Предоставить пользователю функционал для чтения/установки значения Capacity при работе с динамическими массивами"

 "Изменения по улучшению инфографики сервиса "Сигналы""

 
A100:
О чем я и говорил

Шаблонный typedef и использование typedef в шаблонном классе - это разные вещи.
Второй вариант рабочий, но возникает проблема с перекрытием пространства имен при повторном использовании шаблонного класса с другим типом.