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

 
Pamagite #:
Не помогло. Скажу больше, при смене тф бары которые были нарисованы стираются 
а у вас в конфиге сколько выставлено "отображать баров" и "хранить в истории баров" ?
 
Bugs Mt5 (build 3291) Проблемы в инициализации статических переменных функции, когда та используется для инициализации другой статической переменной.
Пишешь return true, а код без твоего ведома инициализирует переменную как false.


Наличие проблемы зависит от типа статической переменной, используемой в функции. В основном проблема касается простых типов, включая string. Для последнего проблема может приводить к Memory Leak.
Такое впечатление, что в начале инициализации первой статической переменной выставляется некий флаг, который и не дает инициализироваться другим статическим переменным из функции.
#define PRINT(x) Print(#x, ":", string(x))

bool func(){
   static string prev_str;
   string new_str;
   StringInit(new_str, 12345, 0x22);
   prev_str = new_str;                                 // 1 leaked strings left (32768 bytes of leaked memory)

   //static bool result = typename(A) == typename(A);   
   static bool result = true;                          // result == false
   return result;
}

class A{
public:
   static bool value;
};
static bool A::value = func();                         



void OnStart()
{
   Print(A::value);    // false
}
 
Sergey Dzyublik #:
Bugs Mt5 (build 3291) Проблемы в инициализации статических переменных функции, когда та используется для инициализации другой статической переменной.
Пишешь return true, а код без твоего ведома инициализирует переменную как false.


Наличие проблемы зависит от типа статической переменной переменной, используемой в функции. В основном проблема касается простых типов, включая string. Для последнего проблема может приводить к Memory Leak.
Такое впечатление, что в начале инициализации первой статической переменной выставляется некий флаг, который и не дает инициализироваться другим статическим переменным из функции.

Интересно, что если сделать так, то возвращает true. Опасный баг.

static bool result = !::MQLInfoInteger(MQL_TESTER);
 

MT5 5.00 build 3291 Не работает Print в скрипте

//+------------------------------------------------------------------+
//|                                                         TEST.mq5 |
//|                                                    Alexey Valeev |
//|                            https://www.mql5.com/ru/users/pozitif |
//+------------------------------------------------------------------+
#property copyright "Alexey Valeev"
#property link      "https://www.mql5.com/ru/users/pozitif"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
   Print("Hello MQL!");
}
//+------------------------------------------------------------------+

Вывод


 
Alexey Valeev #:

MT5 5.00 build 3291 Не работает Print в скрипте

Вывод


А вкладка какая?
 
Alexey Valeev #:

MT5 5.00 build 3291 Не работает Print в скрипте

Вывод


Вы вероятно не там ищите. Вкладка "Эксперты", смотрите там.

 

У меня может банальный вопрос, но что то встрял.

Не отображается короткое имя индикатора в МТ5. Аналогичный индикатор в МТ4 все показывает.

Вот такой OnInit:

int OnInit() {
   g_sShortName=StringFormat("ATR(%d) %s", inp_period_atr, EnumToString(inp_timeframes));
   printf("NAME: %s", g_sShortName);
   IndicatorSetString(INDICATOR_SHORTNAME, g_sShortName);
   g_nWinIndex=ChartWindowFind();                  // Определяем номер подокна индикатора
   EventSetTimer(1);
   
   SetIndexBuffer(0, buffer, INDICATOR_DATA);

   TableInit();
//---
   return(INIT_SUCCEEDED);
}

В принте имя индикатора пишет.

 
Sergey Gridnev #:
А вкладка какая?
Andrey Kaunov #:

Вы вероятно не там ищите. Вкладка "Эксперты", смотрите там.

Блин, дико извиняюсь, запарился, действительно в журнале ж смотрю. Где моя внимательность... Пол часа не мог понять почему от индикатора результаты через принт не выводятся.

 
Bug ME (build 3296) Везде где возможно, при отладке или неудачной компиляции обрезается имя функции/класса, если ее длина превышает некий не совсем большой лимит порядка 256 символов.
Проблема подымалась еще два года назад.
Код для наглядности, запускать в debug режиме:
class IteratorRandomAccess_Base{};

template<typename _IteratorRandomAccess1, typename _IteratorRandomAccess2, typename _IteratorRandomAccess3, typename _IteratorRandomAccess4>
class iterator_wrapper{
public:
   iterator_wrapper(){}
   iterator_wrapper(iterator_wrapper &obj){this = obj;}
};


template<typename _IteratorRandomAccess1, typename _IteratorRandomAccess2, typename _IteratorRandomAccess3, typename _IteratorRandomAccess4>
iterator_wrapper<_IteratorRandomAccess1, _IteratorRandomAccess2, _IteratorRandomAccess3, _IteratorRandomAccess4>
search(iterator_wrapper<_IteratorRandomAccess1, _IteratorRandomAccess2, _IteratorRandomAccess3, _IteratorRandomAccess4> &first1,
       iterator_wrapper<_IteratorRandomAccess1, _IteratorRandomAccess2, _IteratorRandomAccess3, _IteratorRandomAccess4> &first2,
       iterator_wrapper<_IteratorRandomAccess1, _IteratorRandomAccess2, _IteratorRandomAccess3, _IteratorRandomAccess4> &first3,
       iterator_wrapper<_IteratorRandomAccess1, _IteratorRandomAccess2, _IteratorRandomAccess3, _IteratorRandomAccess4> &first4)
{
   DebugBreak();        // #1   
   //first1 = 1;        // #2   Uncomment it to check the issue with the completion error description
   return first1;
}

void OnStart()
{
   iterator_wrapper<IteratorRandomAccess_Base, IteratorRandomAccess_Base, IteratorRandomAccess_Base, IteratorRandomAccess_Base> it;
   search(it, it, it, it);
}

#1 - проблема касается как в окна стека вызовов так и в окна значений переменных;
#2 - проблема касается окна описания ошибок компиляции.
 
Ввиду текущих работ по МЕ, прошу наконец-таки реализовать поддержку intellisense для namespace.
На текущий момент, с точки зрения UX(User Experience) использование namespace просто неюзабельно, необходимо на память запоминать названия десятка функций, ведь ни какая подсказка не всплывает.

В конечном итоге от namespace пришлось отказаться в пользу статических методов класса, где  intellisense работает на ура.
Единственный плюс namespace - это  "extension namespace definition", но и тут проще реализовывать отсутствующую возможность через include костыли, чем пользоваться namespace в MQL.
namespace NameSpace{  
   void func(int &[], int, int){}
};

// included from other file
namespace NameSpace_A{  
   void func(string, int, int){}
};


class ClassNameSpace{  
public:
   static void func(int &[], int, int){}
   
   // included from other file
   static void func(string, int, int){}
};


void OnStart(){
   NameSpace::fun                       // Intellisense results:   NONE
   ClassNameSpace::fun                  // Intellisense results:   "func(string ,int ,int )"  "func(int &[],int ,int )"
}



Причина обращения: