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

 
Vigor:

Столкнулся с проблемой переполнения стека вызова (так я думаю).

После вызова метода одного из объектов , см. пример ниже. Код упрощенный, только суть. Класс CClass1 - базовый, и в списке list1 разные объекты потомки этого класса, и init функции у них имеют разную реализацию. Так вот в одном классе где init функция перебирает подобный список (проще говоря, инициализация вложенного интерфейса, панели в панели) после возврата из init  в строке

возникает ошибка

2010.12.02 00:21:00    test1 (EURUSD,H1)    Invalid pointer access in 'Container.mqh' (74,10)

Т.е. указатель t - мертвый.

При отладке такая ошибка отсутствует, после вызова метода указатель "живой", вложенные интерфейсы создаются и эксперт работает дальше.

Обойти ошибку удалось только так:

указанием #property stacksize ничего не добился.

Трудно что-либо сказать определенно. Нужны исходники.

Попробуйте написать заявку в сервисдеск

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 

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

читаю в изменениях:  6. MQL5: Исправлена обработка события клика на чарте.

Теперь при щелчке на графическом объекте генерируются сразу же два события: CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, а раньше было только одно CHARTEVENT_OBJECT_CLICK, что позволяло моделировать двойной щелчок мышки

Теперь так всегда будет или это баг?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 
AlexSTAL:

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

читаю в изменениях:  6. MQL5: Исправлена обработка события клика на чарте.

Теперь при щелчке на графическом объекте генерируются сразу же два события: CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, а раньше было только одно CHARTEVENT_OBJECT_CLICK, что позволяло моделировать двойной щелчок мышки

Теперь так всегда будет или это баг?

Это было сделано намеренно.
 

В очередной раз долбанулся об стену невозможности,

требуется передать параметр в конструктор, чтоб класс инициализировался с определёнными параметрами,

как обойти проблему? что посоветуете?

 
Urain:

В очередной раз долбанулся об стену невозможности,

требуется передать параметр в конструктор, чтоб класс инициализировался с определёнными параметрами,

как обойти проблему? что посоветуете?


к

 

так, другого выхода не вижу

 

class test{
  private:
    bool inited;
    int value;  
  public:
    void test(){
      inited = false;
    }
    
  bool Set( int passed ){
    value = passed;
    return(true);
  }
  bool Init( int passed ){
    if ( Set( passed ) ){
      inited = true;
      return(true);
    }
    return(false);
  }
  int Get( ){
    if( !inited ){
      Print("Объект неинициализирован");
      return(-1);
    }
    return(value);
  }
};

void OnStart()
  {
  
  
  test var;
  if( !var.Init(1)){
    Print("Ошибка инициализации объекта");
    return;
}
  Print(var.Get());
  
  test var2;
  Print( var2.Get() );
  }

 

ну и конечно же нужно в правильном порядке расставить Init-ы в случае наследуемых классов

 

а вообще бы хотелось, что бы написали статью об обработке ошибок в сложных проектах, Print и return как здесь - это не выход. 

 
gdtt:

так, другого выхода не вижу

 

ну и конечно же нужно в правильном порядке расставить Init-ы в случае наследуемых классов

 

а вообще бы хотелось, что бы написали статью об обработке ошибок в сложных проектах, Print и return как здесь - это не выход. 

Тоесть создавать доконструктор который бы завершил процесс конструирования, и который в свою очередь выставляет флаг инициализации.

В общем зачёт, но есть неудобства. Прийдётся опрашивать в каждой функции флаг инициализации, а при большом количестве функций класса это не удобно.

Вдруг прийдётся чтото менять этож все функции нужно будет переписывать.

ЗЫ Я тут подредактнул код, исплавил описку.

class test
  {
private:
   bool              inited;
   int               value;
public:
                     test(void){inited=false;};
   bool Set(int passed){value=passed;return(true);};
   bool Init(int passed)
     {
      if(Set(passed))inited=true;    
      return(inited);
     };
   int Get()
     {
      if(!inited)
        {
         Print("Объект неинициализирован");
         return(-1);
        }        
      return(value);
     };
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {

   test var;
   var.Init(1);
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }
 
Urain:

Тоесть создавать доконструктор который бы завершил процесс конструирования, и который в свою очередь выставляет флаг инициализации.

В общем зачёт, но есть неудобства. Прийдётся опрашивать в каждой функции флаг инициализации, а при большом количестве функций класса это не удобно.

Вдруг прийдётся чтото менять этож все функции нужно будет переписывать.

ЗЫ Я тут подредактнул код, исплавил описку.

дак если бы был конструктор, это же не значит, что инициализация прошла успешно. по любому нужно преверять факт инициализации

 

можно конечно проверку однократно выполнять:

void OnStart()
  {

   test var;
   if( ! var.Init(1)){
     // здесь какято обрабтка
     return;
   };
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }

но если пользуешься своим кодом, можно взять за правило проверять факт инициализации во времы вызова, а если он будет другими использоваться, не напишешь же в инструкции: "обязательно использовать только такую конструкцию, иначе за последствия не ручаюсь.". Не, полюбому нужно выполнять проверки на инициализацию в методах класса

 

Разработчикам.

Сразу после рестарта нового билда


PS

Обновление терминала установленного в другую папку прошло успешно, символы в списке есть (правда там не было открытых графиков до обновления)...

 

Скажите это баг или так делать нельзя. написал следующее

ENUM_ORDER_TYPE Signal[21];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArrayInitialize(Signal,WRONG_VALUE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Выдает ошибку

'ArrayInitialize' - no one of the overloads can be applied to the function call 
 
sergey1294:

Скажите это баг или так делать нельзя. написал следующее

Выдает ошибку


Скорей всего тут речь о том, что ArrayInitialize() предназначена для заполнения только массивов с определенным типом, если быть точным числовых (скорей всего int или double).

Поскольку массив имеет тип ENUM_ORDER_TYPE вызов ArrayInitialize выдает ошибку, сообщая о том что такой метод вызова недопустим.

На  мой взгляд в этом случае существует два варианта:

1. Изменить тип массива ENUM_ORDER_TYPE на int, при этом учесть это в коде (по крайней мере типы ордеров без труда могут быть представлены в виде int);

2. Самостоятельно реализовать "инициализацию" массива.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Причина обращения: