нет, указатель это указатель, в MQL он дескриптор, не суть - но новую копию обьекта создавать не корректно это, вот так сейчас работает корректно:
но если следовать твоей логике, то и в этом коде будет создана копия обьекта l в ф-ции SetLabel() - я же указатель передал, а не ссылку?
Нет. Здесь l - параметр метода, через который передаем нужный указатель. Здесь всё хорошо. Здесь указатель остаётся на ранее созданный объект. Тут же нет создания нового объекта и переназначение указателя на него с потерей прошлого объекта.
Artyom Trishkin: Нет. Здесь l - параметр метода, через который передаем нужный указатель. Здесь всё хорошо. Здесь указатель остаётся на ранее созданный объект. Тут же нет создания нового объекта и переназначение указателя на него с потерей прошлого объекта.
все равно не корректно все работает
вот эти "указатели" в MQL заточены под работу в области видимости класса, я не хочу создавать класс, беру и объявляю в глобальной видимости указатель, затем передаю его в любую ф-цию и то что в этой ф-ции я создаю дескриптор обьекта не есть повод уничтожать обьект при выходе из локальной видимости ф-ции
сейчас немного занят, но нужно тестовые примеры без графики сделать - думаю такая же беда будет, что если вошел в ф-цию с указателем со значением POINTER_INVALID, то и выйдешь с таким же POINTER_INVALID , по ссылке да, все будет работать корректно, но вроде по ссылке нельзя передать указатель с POINTER_INVALID - будет ошибка обращения к указателю
вот эти "указатели" в MQL заточены под работу в области видимости класса, я не хочу создавать класс, буру и объявляю в глобальной видимости указатель, затем передаю его в любую ф-цию и то что в этой ф-ции я создаю дескриптор обьекта не есть повод уничтожать обьект при выходе из локальной видимости ф-ции
сейчас немного занят, но нужно тестовые примеры без графики сделать - думаю такая же беда будет, что если вошел в ф-цию с указателем со значением POINTER_INVALID, то и выйдешь с таким же POINTER_INVALID , по ссылке да, все будет работать корректно, но вроде по ссылке нельзя передать указатель с POINTER_INVALID - будет ошибка обращения к указателю
Как раз объект не уничтожается. Просто после создания нового объекта внутри метода, имеем уже два объекта. А указатель-то один - в метод он был передан формальным параметром. Таким образом теряем указатель на один из объектов.
typedefvoid (* callback)(int &);
template<typename T>
void ff(T &){}
voidOnStart(){
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 секунд! Ни в какие ворота не лезет... Как это можно объяснить?
За последнее время предоставлено информацию о десятке "особенностей" работы и багов в МТ. Как узнать стоит ждать их исправление или нет? Прошу не предлагать тестить все каждый раз при выходе нового билда. #(не исправлено в 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 при работе с динамическими массивами"
# "Изменения по улучшению инфографики сервиса "Сигналы""
Шаблонный typedef и использование typedef в шаблонном классе - это разные вещи. Второй вариант рабочий, но возникает проблема с перекрытием пространства имен при повторном использовании шаблонного класса с другим типом.
Переназначая указатель на новый объект, теряем предыдущий объект, на который указывал переназначенный указатель .
нет, указатель это указатель, в MQL он дескриптор, не суть - но новую копию обьекта создавать не корректно это, вот так сейчас работает корректно:
но если следовать твоей логике, то и в этом коде будет создана копия обьекта l в ф-ции SetLabel() - я же указатель передал, а не ссылку?
new надо убирать. Объекты же есть уже, и указатели на них.
вопрос не как решить проблему, а почему при глобальной области видимости переменной CChartObjectLabel *LabelUP,*LabelDN; - потерялся указатель!
нет, указатель это указатель, в MQL он дескриптор, не суть - но новую копию обьекта создавать не корректно это, вот так сейчас работает корректно:
но если следовать твоей логике, то и в этом коде будет создана копия обьекта l в ф-ции SetLabel() - я же указатель передал, а не ссылку?
Нет. Здесь l - параметр метода, через который передаем нужный указатель. Здесь всё хорошо. Здесь указатель остаётся на ранее созданный объект. Тут же нет создания нового объекта и переназначение указателя на него с потерей прошлого объекта.
все равно не корректно все работает
вот эти "указатели" в MQL заточены под работу в области видимости класса, я не хочу создавать класс, беру и объявляю в глобальной видимости указатель, затем передаю его в любую ф-цию и то что в этой ф-ции я создаю дескриптор обьекта не есть повод уничтожать обьект при выходе из локальной видимости ф-ции
сейчас немного занят, но нужно тестовые примеры без графики сделать - думаю такая же беда будет, что если вошел в ф-цию с указателем со значением POINTER_INVALID, то и выйдешь с таким же POINTER_INVALID , по ссылке да, все будет работать корректно, но вроде по ссылке нельзя передать указатель с POINTER_INVALID - будет ошибка обращения к указателю
все равно не корректно все работает
вот эти "указатели" в MQL заточены под работу в области видимости класса, я не хочу создавать класс, буру и объявляю в глобальной видимости указатель, затем передаю его в любую ф-цию и то что в этой ф-ции я создаю дескриптор обьекта не есть повод уничтожать обьект при выходе из локальной видимости ф-ции
сейчас немного занят, но нужно тестовые примеры без графики сделать - думаю такая же беда будет, что если вошел в ф-цию с указателем со значением POINTER_INVALID, то и выйдешь с таким же POINTER_INVALID , по ссылке да, все будет работать корректно, но вроде по ссылке нельзя передать указатель с POINTER_INVALID - будет ошибка обращения к указателю
С удивлением обнаружил возможность объявления typedef с указателем на шаблонную функцию.
Однако счастье не оказалось долгим.
typedef с указателем на шаблонную функцию является ли запланированным к использованию функционалом?
При работе с typedef использование шаблонной функции с явной специализацией не вызывает генерацию кода этой шаблонной
Создаю кастомный символ и заполняю его дневными барами за 25 лет, это должно весить примерно 400 кб. Однако в папке символа создаются .hcc файлы суммарным размером 15 мб! И вдобавок всё это занимает около 20 секунд! Ни в какие ворота не лезет... Как это можно объяснить?
С удивлением обнаружил возможность объявления 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 при работе с динамическими массивами"
# "Изменения по улучшению инфографики сервиса "Сигналы""
О чем я и говорил
Шаблонный typedef и использование typedef в шаблонном классе - это разные вещи.
Второй вариант рабочий, но возникает проблема с перекрытием пространства имен при повторном использовании шаблонного класса с другим типом.