Если к массиву применить ArrayResize, то что произойдёт с уже имеющимися значениями элементов массива?

 
  • 62% (41)
  • 9% (6)
  • 29% (19)
Всего проголосовало: 66
 
Не верно ставите вопрос. Все зависит от того в какую сторону происходит изменение размера массива. Если увеличение то имеющиеся данные сохранятся, если уменьшения, то часть данных будет потеряна.
 
Yury Kirillov:
Гораздо быстрее написать код и проверить, чем создавать тему на форуме...
 
то что не обрежется - сохранится
 

имевшиеся ранее элементы массива будут переживать бурные эмоции.

 

Уж лучше пример, чем гадать...

//+------------------------------------------------------------------+
//|                                                  ArrayResize.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявим динамический массив
   double arr_dynamic[];
//--- новый размер в первом измерении массива
   if(ArrayResize(arr_dynamic,5)==-1)
     {
      Print("Ошибка ArrayResize");
      return;
     }

   for(int i=0;i<ArraySize(arr_dynamic);i++)
      arr_dynamic[i]=i;

//--- распечатка значений до увеличения размера
   Print("Перед ArrayResize массив имеет такие элементы:");
   ArrayPrint(arr_dynamic);

//--- увеличим размер на два элемента
   if(ArrayResize(arr_dynamic,ArraySize(arr_dynamic)+2)==-1)
     {
      Print("Ошибка ArrayResize");
      return;
     }
//--- распечатка значений после увеличения размера
   Print("После ArrayResize (увеличения размера) массив имеет такие элементы:");
   ArrayPrint(arr_dynamic);

//--- новый размер в первом измерении массива установим равным 3 (то есть уменьшим размер массива)
   if(ArrayResize(arr_dynamic,3)==-1)
     {
      Print("Ошибка ArrayResize");
      return;
     }
//--- распечатка значений после уменьшение размера
   Print("После ArrayResize (уменьшение размера) массив имеет такие элементы:");
   ArrayPrint(arr_dynamic);
  }
//+------------------------------------------------------------------+

‌и результат:

ArrayResize (USDJPY,M5) Перед ArrayResize массив имеет такие элементы:
ArrayResize (USDJPY,M5)   0.0 1.000 2.000 3.000 4.000
ArrayResize (USDJPY,M5) После ArrayResize (увеличения размера) массив имеет такие элементы:
ArrayResize (USDJPY,M5)    0.0  1.000  2.000  3.000  4.000 +0.000    0.0
ArrayResize (USDJPY,M5) После ArrayResize (уменьшение размера) массив имеет такие элементы:
ArrayResize (USDJPY,M5)   0.0 1.000 2.000


Файлы:
 
Vladimir Karputov:

Уж лучше пример, чем гадать...

‌и результат:



AsSeries будет влиять на результат?
 

Спасибо всем за комментарии, особенно Vladimir Karputov.

ArraySetAsSeries() на результат не влияет (если чо).  

Vladimir Karputov
Vladimir Karputov
  • www.mql5.com
Профиль трейдера
 
Vitalii Ananev:
Не верно ставите вопрос. Все зависит от того в какую сторону происходит изменение размера массива. Если увеличение то имеющиеся данные сохранятся, если уменьшения, то часть данных будет потеряна.

Это для одномерного массива.
 

По просьбам трудящихся добавил в пример двумерный массив:

//+------------------------------------------------------------------+
//|                                                  ArrayResize.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- объявим динамические массивы
   double arr_dynamic[];
   double arr_dynamic_multi[][2];
//--- новый размер в первом измерении массива
   if(ArrayResize(arr_dynamic,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,5)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }

   for(int i=0;i<ArraySize(arr_dynamic);i++)
      arr_dynamic[i]=i;
   for(int i=0;i<ArrayRange(arr_dynamic_multi,0);i++)
     {
      arr_dynamic_multi[i][0]=i;
      arr_dynamic_multi[i][1]=i*10;
     }

//--- распечатка значений до увеличения размера
   Print("Перед ArrayResize массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("Перед ArrayResize массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- увеличим размер на два элемента
   if(ArrayResize(arr_dynamic,ArraySize(arr_dynamic)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,ArrayRange(arr_dynamic_multi,0)+2)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после увеличения размера
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (увеличения размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);

//--- новый размер в первом измерении массива установим равным 3 (то есть уменьшим размер массива)
   if(ArrayResize(arr_dynamic,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic\"");
      return;
     }
   if(ArrayResize(arr_dynamic_multi,3)==-1)
     {
      Print("Ошибка ArrayResize for \"arr_dynamic_multi\"");
      return;
     }
//--- распечатка значений после уменьшение размера
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic\" имеет такие элементы:");
   ArrayPrint(arr_dynamic);
   Print("После ArrayResize (уменьшение размера) массив \"arr_dynamic_multi\" имеет такие элементы:");
   ArrayPrint(arr_dynamic_multi);
  }
//+------------------------------------------------------------------+

и результат:

Перед ArrayResize массив "arr_dynamic" имеет такие элементы:
    0.0 1.00000 2.00000 3.00000 4.00000
Перед ArrayResize массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]      0.0      0.0
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
После ArrayResize (увеличения размера) массив "arr_dynamic" имеет такие элементы:
      0.0   1.00000   2.00000   3.00000   4.00000 -5.7E+296  +0.00000
После ArrayResize (увеличения размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]      0.0      0.0
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
[3,]  3.00000 30.00000
[4,]  4.00000 40.00000
[5,] +0.00000 +0.00000
[6,] +0.00000 +0.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic" имеет такие элементы:
    0.0 1.00000 2.00000
После ArrayResize (уменьшение размера) массив "arr_dynamic_multi" имеет такие элементы:
         [,0]     [,1]
[0,]      0.0      0.0
[1,]  1.00000 10.00000
[2,]  2.00000 20.00000
Файлы:
Причина обращения: