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

 
Alexey Kozitsyn:
Добавьте конструктор по умолчанию в структуру.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2017.09.06 09:38

// Нужен только для того, чтобы показать необходимость решения без конструктора
union UNION
{
  STRUCT Struct; // конструктора не должно быть
  int i;
};
 
fxsaber:

Невнимательный я:) А можете пояснить зачем это нужно? Почему нельзя использовать конструктор?

Или это для того, чтобы показать ошибку инициализации структуры с закрытым полем?

 
Alexey Kozitsyn:

Невнимательный я:) А можете пояснить зачем это нужно? Почему нельзя использовать конструктор?

Потому что при написании своего кода наткнулся именно на ситуацию, что моя структура задействована в union. Решение с пустым конструктором пришло сразу в голову, но возник облом, что в коде есть union. Поэтому вопрос задаю не занудства ради, а для практического применения.


Пришлось написать такой изврат, чтобы обойти этот "баг" (это баг или нет?)

// Зануляем структуру без конструктора со скрытыми полями
template <typename T>
void StructToNull( T& Struct )
{    
  union TMP_UNION
  {
    T Struct;
    
    struct TMP_STRUCT
    {
      uchar Array[sizeof(T)];
    } Tmp;
    
    TMP_UNION( T& Value )
    {
      ::ArrayInitialize(this.Tmp.Array, 0);
      
      Value = this.Struct;
    }
  } TmpUnion(Struct);    
}


Другого решения не увидел пока.

 
fxsaber:
Запустил, увидел проблему. Похоже с юнионами сейчас разрешено использовать только структуры с паблик-полями. Тогда можно будет написать struct = {0};
 
Alexey Kozitsyn:
Запустил, увидел проблему. Похоже с юнионами сейчас разрешено использовать только структуры с паблик-полями. Тогда можно будет написать struct = {0};

Это не так.

 

Может я опять Вас не понял, но этот код работает без предупреждений:

struct STRUCT
{
//private:
  int i;

};

// Нужен только для того, чтобы показать необходимость решения без конструктора
union UNION
{
  STRUCT Struct; // конструктора не должно быть
  int i;
};

// Обходим Warning "possible use of uninitialized variable"
template <typename T>
void StructInit( T& ) {}

STRUCT Func()
{
  STRUCT Res = {0}; // ок!
  
//  StructInit(Res); // с этой строкой Warning не появляется, но это какой-то абсурд!
  
  return(Res);  
}

void OnStart()
{
  Func();
}
 
Alexey Kozitsyn:

Может я опять Вас не понял, но этот код работает без предупреждений:

Все верно, public-структуры инициализируются. Но union к этому никакого отношения не имеет.


Интересно, что если структуру со скрытым полем сделать паблик-полем новой структуры, то и новая не будет инициализироваться, хоть у нее все поля открыты.

 

Здравствуйте! Подскажите, можно ли объявить массив, указав количество элементов в нём через переменную? Если нет, то как можно реализовать эту задачу?

extern int Period = 10;
int Massiv[Period]; //Выдаёт ошибку: "invalid index value"
 
giros:

Здравствуйте! Подскажите, можно ли объявить массив, указав количество элементов в нём через переменную? Если нет, то как можно реализовать эту задачу?

https://www.mql5.com/ru/docs/array/arrayresize

Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
Операции с массивами / ArrayResize - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
giros:

Здравствуйте! Подскажите, можно ли объявить массив, указав количество элементов в нём через переменную? Если нет, то как можно реализовать эту задачу?


ArrayResize()

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