Инициализация массивов структур

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Evgeny Potapov
1772
Evgeny Potapov  

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

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

Ihor Herasko
19739
Ihor Herasko  
Evgeny Potapov:

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

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

Инициализируются, если в структуре имеется конструктор.

struct SampleStruct
{
   int a;
   SampleStruct()
   {
      a = 100; 
      Print(__FUNCTION__);
   }   
};

void OnStart()
{
   SampleStruct array[10];
}

 Результат:

2016.05.23 12:11:26.558 Test NZDUSD,H1: uninit reason 0
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: SampleStruct::SampleStruct
2016.05.23 12:11:26.558 Test NZDUSD,H1: initialized
Evgeny Potapov
1772
Evgeny Potapov  
Ihor Herasko:

Инициализируются, если в структуре имеется конструктор.

 Результат:

Спасибо за пример!

А в других случаях: если

1. массив объявляется глобально?

2. статически?

3. как свойство класса?

Dr. Trader
4171
Dr. Trader  

Сами по себе структуры не инициализируются. И массивы структур тоже не инициализируются. Если нужна просто чистая структура я обычно делаю так:

MqlTradeRequest mtr = {0};
MqlDateTime mdta[] = {0};

Мне кажется пример Ihor будет работать во всех трёх случаях, а мой только в первых двух.

Evgeny Potapov
1772
Evgeny Potapov  
Dr.Trader:

Сами по себе структуры не инициализируются. И массивы структур тоже не инициализируются. Если нужна просто чистая структура я обычно делаю так:

Мне кажется пример Ihor будет работать во всех трёх случаях, а мой только в первых двух.

Ого! Совсем новый синтаксис! Спасибо! Приму на вооружение!
Ihor Herasko
19739
Ihor Herasko  
Evgeny Potapov:

Спасибо за пример!

А в других случаях: если

1. массив объявляется глобально?

2. статически?

Аналогичным образом. 

 

3. как свойство класса?

Непосредственно перед выполнением конструктора класса.
Evgeny Potapov
1772
Evgeny Potapov  
Ihor Herasko:

Аналогичным образом. 

Непосредственно перед выполнением конструктора класса.

Спасибо! Кажется с начальной инициализацией стало всё понятно.

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

Как-то возможно принудительно инициализировать массив структур, являющийся свойством класса?

Ihor Herasko
19739
Ihor Herasko  
Evgeny Potapov:

Спасибо! Кажется с начальной инициализацией стало всё понятно.

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

Как-то возможно принудительно инициализировать массив структур, являющийся свойством класса?

Способов много. Можно сделать специальный метод класса, который выполняет эту задачу. Если же инициализация уже проходит в цикле, то видоизменяем структуру следующим образом:

struct SampleStruct
{
   int a;
   SampleStruct()
   {
      Init();
   }

   void Init()
   {
      a = 100; 
      Print(__FUNCTION__);
   }   
};

 А в цикле просто:

for (int i = 0; i < 10; i++)
   array[i].Init();
Evgeny Potapov
1772
Evgeny Potapov  
Ihor Herasko:

Способов много. Можно сделать специальный метод класса, который выполняет эту задачу. Если же инициализация уже проходит в цикле, то видоизменяем структуру следующим образом:

 А в цикле просто:

Замечательный пример!

Я был уверен, что функция не может быть элементом структуры, а оказывается может!

Спасибо!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий