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

 
MT5 (build 2057) 

Ошибка компиляции при повторном использовании одной и той же сигнатуры функции в рамках typedef:
typedef void (* callback_0)();     // а без этой строки все ОК
typedef void (* callback)();

void test_func(){}

void OnStart(){
   callback func_ptr = test_func;  //'test_func' - type mismatch
   func_ptr();
}
 
Sergey Dzyublik:
MT5 (build 2057) 

Баг с "запретом" на повторное использование одной и той же сигнатуры в рамках typedef:

А у меня похожий по сути скрипт более чем 2-х годичной давности выдаёт в 2056x32 результат: EX5 loading failed

 
Sergey Dzyublik:
Кто-то знает как кроме ожидания нового билда с поддержкой namespace для классов обойти это ограничение:

Скомпилировать

void f(int&) {}
void OnStart()
{
   TestTypedef<int> int_value;
   TestTypedef<string> string_value;

можно (и даже будет работать), но не более того: далее допустим нельзя будет написать

   int_value.eq = f;
}

поэтому не пишу как

 
A100:

Скомпилироватьпоэтому не пишу как

Не не, оно все же с трудом, но работает...
Там в примере в typedef тип bool затерялся немного.

#define PRINT(x) ; Print(#x, ":", string(x))

#define CREATE_TestTypedef(type)                              \
class TestTypedef_##type{                                     \
public:                                                       \
   typedef bool (* callback_##type)(type &);                  \
   callback_##type eq;                                        \
}
   
bool f(int&) {return true;}


void OnStart(){
   CREATE_TestTypedef(int) int_value;
   CREATE_TestTypedef(string) string_value;                     
   
   int data = 5;
   int_value.eq = f;
   PRINT(int_value.eq(data));                    // result: true
}
 
До выхода исправлений в typedef и обновлений namespace, если они кончено будут, 
придется отдельно декларировать использование каждого типа через макросы, а затем опять через макросы получать уже имя сгенерированных классов что бы создать объект класса... 
 

Обьясните почему при создании CChartObjectLabel у меня не удаляются обекты в индикаторе при деинициализации в таком коде:

//+------------------------------------------------------------------+
//|                                                         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()
  {
   CreateLabel(LabelUP,"LabelUP",0);
   CreateLabel(LabelDN,"LabelDN",30);
/*   
   LabelUP=new CChartObjectLabel;
   LabelDN=new CChartObjectLabel;
   LabelUP.Create(0,"LabelUP",ChartWindowFind(),0,0);
   LabelUP.Color(clrYellow);
   LabelUP.FontSize(14);
   LabelUP.Description("LabelUP");
   
   LabelDN.Create(0,"LabelDN",ChartWindowFind(),0,10);
   LabelDN.Color(clrYellow);
   LabelDN.FontSize(14);
   LabelDN.Description("LabelDN");
*/
//---
   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 CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }
//+------------------------------------------------------------------+

при переключении ТФ получаю запись в журнале: 2019.05.23 09:49:02.044 tstlabel EURUSD,M30: 2 objects of type CChartObjectLabel left

если раскомментировать в OnInit() создание текстовых меток ( CChartObjectLabel ), то все будет корректно работать

в ф-цию CreateLabel() передаю указатель, а удалить его потом в OnDeinit() почему то не удается

 
Igor Makanu:

Обьясните почему при создании CChartObjectLabel у меня не удаляются обекты в индикаторе при деинициализации в таком коде:

при переключении ТФ получаю запись в журнале: 2019.05.23 09:49:02.044 tstlabel EURUSD,M30: 2 objects of type CChartObjectLabel left

если раскомментировать в OnInit() создание текстовых меток ( CChartObjectLabel ), то все будет корректно работать

в ф-цию CreateLabel() передаю указатель, а удалить его потом в OnDeinit() почему то не удается

Создаётся новый объект l. И он-то не удаляется.
 
Artyom Trishkin:
Создаётся новый объект l. И он-то не удаляется.

логично

но область видимости переменных CChartObjectLabel *LabelUP,*LabelDN; у меня глобальная?

значит я могу в любом участке кода произвести модификацию переменой ?

я передаю в ф-цию CreateLabel() указатель, почему у меня создается новая копия?

имхо, не корректно все это работает

ЗЫ: если создать обьекты в OnInit() и затем произвести работу с ними в CreateLabel() (т.е. создаю обьекты отдельно, а работаю с ними по указателю) то все будет работать корректно - но не припомню случая в других компиляторах чтобы передача указателя в ф-цию создавала новый объект - указатель он и в Африке указатель!

 
Igor Makanu:

логично

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

я передаю в ф-цию CreateLabel() указатель, почему у меня создается новая копия?

имхо, не корректно все это работает

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

логично

но область видимости переменных CChartObjectLabel *LabelUP,*LabelDN; у меня глобальная?

значит я могу в любом участке кода произвести модификацию переменой ?

я передаю в ф-цию CreateLabel() указатель, почему у меня создается новая копия?

имхо, не корректно все это работает

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