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

 
Vladimir Simakov:

1
2
3
4
6

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

TheXpert:

эээ в смысле?

В Visual Studio такая картина

 
Поменяйте местами массив и переменную в структуре.
 
Vladimir Simakov:
Поменяйте местами массив и переменную в структуре.

какая разница


 
Aliaksandr Hryshyn:
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}};

Имхо если массив не очень большой, то можно пользоваться классом динамического массива, в частности CArrayInt.

Вот что-то наподобие:

#include <Arrays\ArrayInt.mqh>
//---
struct SData
  {
   int               i_count;
   CArrayInt        *ptr_arr;
   double            d1;
   //--- конструктор по умолчанию
   void SData::SData(void)
     {
      i_count=0;
      ptr_arr=new CArrayInt;
      d1=0.;
     }
   //--- конструктор с параметрами   
   void SData::SData(const int _count,const int &_arr[],const double _val)
     {
      i_count=_count;
      ptr_arr=new CArrayInt;
      for(int i=0;i<ArraySize(_arr);i++)
         ptr_arr.Add(_arr[i]);
      d1=_val;
     }
   //--- деструктор
   void SData::~SData(void)
     {
      delete ptr_arr;
     }
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//SData data[]={{3,{2,3,4},9.3},{5,{9,10,11,12,15},0.4}};   
   int arr1[]={2,3,4};
   int arr2[]={9,10,11,12,15};
   SData data1(3,arr1,9.3),data2(5,arr2,0.4);
  }
Конструктор копирования и оператор присваивания нужно самому будет придумать...
 

МКЛ массив[] != c++ массив[], это совсем другое, вам нужен vector

#include <vector>
using namespace std;

struct S {vector<int> v;};

int main()
{
   S s{{1,3,4}};
}
 
Nikolai Semko:

какая разница


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

struct MyStruct
{
        double b;
        int a[];
};


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

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

 
Denis Kirichenko:

Имхо если массив не очень большой, то можно пользоваться классом динамического массива, в частности CArrayInt.

Вот что-то наподобие:

Конструктор копирования и оператор присваивания нужно самому будет придумать...

Копирования не должно быть, массивы большие и их может быть много. Буду использовать третий вариант в начале поста.

 
pavlick_:

вам нужен vector

S s{{1,3,4}};


У вас структура с вектором так инициализируется?  У меня ошибку выдаёт

 
Alexey Navoykov:

У вас структура с вектором так инициализируется?  У меня ошибку выдаёт

Да, начиная с С++11 это нормально. Какой у вас компилятор? gcc, clang спокойно кушают, даже не надо указывать стандарт (-std=c++11 или выше). Видимо, вам нужно задать версию стандарта.

 
Vladimir Simakov:

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

Да, Вы правы. Тупанул.

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

struct MyStruct
{
        double b;
        int a[];
};


int main()
{
        //MyStruct test[3] ={ { 0.1,{1,4,6} }, { 0.2, { 1,2,3,6 } }, { 0.4,{1,2,3,8,6} }};  // не работает
        MyStruct test = { 0.4,{1,2,3,4,6} };    // работает
        for (int i = 0; i < 5; i++)
                std::cout << test.a[i] << '\n';
        std::cout << test.b << '\n';
        return 0;
}
Причина обращения: