Инициализация структур с динамическими массивами

 

Это удобно, но памяти много ест:

struct Sii
  {
   int               i_count;
   int               i[65536];//Только часть массива будет использоваться
   double            d1;
  };
Sii ii[]={{3,{2,3,4},9.3},{5,{9,10,11,12,15},0.4}};

void My_function(Sii &param_Sii)//Использование структуры выше в качестве параметра функции
  {
  }

Красиво, памяти много не ест, но неправильно :( :

struct Sii
  {
   int               i[];//Динамический массив
   double            d1;
  };
Sii ii[]={{{2,3,4},9.3},{{9,10,11,12,15},0.4}};

void My_function(Sii &param_Sii)//Использование структуры выше в качестве параметра функции
  {

  }

Не красиво, память не есть.

struct sSC
{
   int start_pos;
   int count;
};
int ii_i[]={2,3,4,9,10,11,12,15};//Все массивы в одном
sSC ii_i_startpos_count[]={{0,3},{3,5}};//Указатели на начальные позиции массивов и их размеры
double ii_d[]={9.3,0.4};//

void My_function(int &param_ii_i[],int &param_ii_i_startpos_count[],double &param_ii_d[])
  {

  }

Ужасно...

 

Это правильно:

class My_class
  {
public:
   void Function1(double &dd[],int &ii[],bool &bb[]);
   void Function2(double &dd[],int &ii[],bool &bb[]);
   void Function3(double &dd[],int &ii[],bool &bb[]);
   void Function4(double &dd[],int &ii[],bool &bb[]);
   void Function5(double &dd[],int &ii[],bool &bb[]);
   void Function6(double &dd[],int &ii[],bool &bb[]);
  };

А хочется так, но не правильно:

class My_class
  {
private:
   double            d_s[];
   int               i_s[];
   bool              b_s[];
public:
   void Init(double &dd[],int &ii[],bool &bb[])
   {
      d_s=dd;//Тут ошибка
      i_s=ii;//Тут ошибка
      b_s=bb;//Тут ошибка
   };
   void Function1();
   void Function2();
   void Function3();
   void Function4();
   void Function5();
   void Function6();
  };

Это красиво, но медленно(массивы большие, инициализация может быть частая):

class My_class
  {
private:
   double            d_s[];
   int               i_s[];
   bool              b_s[];
public:
   void Init(double &dd[],int &ii[],bool &bb[])
     {
      ArrayCopy(d_s,dd);
      ArrayCopy(i_s,ii);
      ArrayCopy(b_s,bb);
     };
   void              Function1();
   void              Function2();
   void              Function3();
   void              Function4();
   void              Function5();
   void              Function6();
  };
Ужасно...
 

Надо просить разработчиков, чтобы сделали возможность инициализации в этом случае:

struct Sii
  {
   int               i[];//Динамический массив
   double            d1;
  };
Sii ii[]={{{2,3,4},9.3},{{9,10,11,12,15},0.4}};

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

 
А почему нельзя сделать нужный конструктор к структуре с переменным количеством параметров? Или же можно создать сам массив и передать его ссылкой в конструктор.
 

В итоге получается: "не хочу использовать ArrayCopy(), хочу использовать =". Кто сказал что = (если бы было), работало бы быстрее, чем ArrayCopy)?

 
Alexey Navoykov:

Надо просить разработчиков, чтобы сделали возможность инициализации в этом случае:

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

согласен.

Это было бы логичнее.

Интересно в C++ так работает?

ЗЫ Попробовал с C++. 

С++ вообще не разрешает использовать динамические массивы в структурах. 

Так что mql более гибкий в этом отношении.

 
Nikolai Semko:

С++ вообще не разрешает использовать динамические массивы в структурах. 

эээ в смысле?

 
Nikolai Semko:

согласен.

Это было бы логичнее.

Интересно в C++ так работает?

ЗЫ Попробовал с C++. 

С++ вообще не разрешает использовать динамические массивы в структурах. 

Так что mql более гибкий в этом отношении.

#include "pch.h"
#include <iostream>

struct MyStruct
{
        int a[];
};


int main()
{
        MyStruct test = {1,2,3,4,6};
        for (int i = 0; i < 5; i++)
                std::cout << test.a[i] << '\n';
        return 0;
}

1
2
3
4
6

C:\Users\Симаков\source\repos\Lerning\Debug\Lerning.exe (процесс 9004) завершает
 работу с кодом 0.
Чтобы автоматически закрывать консоль при остановке отладки, установите параметр
 "Сервис" -> "Параметры" -> "Отладка" -> "Автоматически закрыть консоль при оста
новке отладки".
Чтобы закрыть это окно, нажмите любую клавишу:

 

С++ не дает менять размер массива.

Так и mql4/5, учитывая, что папа/мама у них С++/С# скорее всего просто создает новый и копирует туда данные из старого.

 
Dmitry Fedoseev:

В итоге получается: "не хочу использовать ArrayCopy(), хочу использовать =". Кто сказал что = (если бы было), работало бы быстрее, чем ArrayCopy)?

Под "=" подразумевается просто копирование указателя/ссылки на массив. Поэтому и быстрее, значительно.

 
Ihor Herasko:
А почему нельзя сделать нужный конструктор к структуре с переменным количеством параметров? Или же можно создать сам массив и передать его ссылкой в конструктор.

А что в конструкторе будет? Копирование массивов? Получается, при оптимизации советника, каждый раз будет происходить копирование больших массивов.