ArrayCopy и string

 

Здравствуйте! Не получается копировать структуры с помощью ArrayCopy(), а именно когда в структуре есть элемент с типом string. Если копирую структуры без переменной string то все работает, как приведено ниже и результатом будет - 0 - 1 - 2 - 2 - 3, но только если использовать переменную типа string (в коде она закомментирована) то данные не копируются и результатом будет - 0 - 1 - 2 - 3 - 4. В справке по функции ArrayCopy пишется что "Массивы классов и структур, содержащих объекты, требующие инициализации, не копируются. Массив структур можно скопировать только в массив того же самого типа." Может я не так понимаю справку, тогда как решить этот вопрос? 


//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

struct A
{
   int      i1;
   bool     b1;
   //string   s1;
   double   d1;
   datetime t1;
};

A Arr[];
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   static int k=0;
   if (k==0) 
         {
         ArrayResize(Arr,5);
         for(int i=0;i<5;i++)
            {
               Arr[i].b1=true;
               Arr[i].d1=double(i);
               Arr[i].i1=i;
               //Arr[i].s1=string(i);
               Arr[i].t1=time[i];
            }
            
        ArrayCopy(Arr,Arr,3,2);
        Print(Arr[0].i1," - ",Arr[1].i1," - ",Arr[2].i1," - ",Arr[3].i1," - ",Arr[4].i1);
        k++;   
         }
      
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

можно заменить string на uchar s1[10], будет работать)

 

Да, не копируется. Самому копировать в цикле поэлементно.

 
Вообще задача - нужно удалить элемент массива, где тип массива структуры, в которых есть стринговый элемент-может есть какой другой способ?
 
//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

struct A
{
   int      i1;
   bool     b1;
   uchar    s1[10];
   double   d1;
   datetime t1;
};

A Arr[];
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   static int k=0;
   if (k==0) 
         {
         ArrayResize(Arr,5);
         for(int i=0;i<5;i++)
            {
               Arr[i].b1=true;
               Arr[i].d1=double(i);
               Arr[i].i1=i;
               
               //Arr[i].s1[]=string(i);
               StringToCharArray(string(i),Arr[i].s1);
               Print(CharArrayToString(Arr[i].s1));
               
               Arr[i].t1=time[i];
               
            }
            
        ArrayCopy(Arr,Arr,3,2);
        Print(Arr[0].i1," - ",Arr[1].i1," - ",Arr[2].i1," - ",Arr[3].i1," - ",Arr[4].i1);
        k++;   
         }
      
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Taras Slobodyanik:
Спасибо! то что надо!)
 
Tango_X:
Вообще задача - нужно удалить элемент массива, где тип массива структуры, в которых есть стринговый элемент-может есть какой другой способ?

Массив указателей

 
Для
Dmitry Fedoseev:

Массив указателей

Для меня это темный лес)
 
Tango_X:
ДляДля меня это темный лес)

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

Или подумайте, а так ли нужны строковые переменные в структуре. 

 
Dmitry Fedoseev:

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

Или подумайте, а так ли нужны строковые переменные в структуре. 

Я так и сделал, а строки нужны в структуре
Причина обращения: