Странности с изменением размеров массивов.

 

Вот два одинаковых кода. Один для индикатора, другой для советника.

Индикатор:

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init()
 {
  int CheckingArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  Comment ("ArraySize (CheckingArray) = ", ArraySize (CheckingArray));
  ArrayResize (CheckingArray, 0);
 }
void deinit() {}
void start() {}
//+------------------------------------------------------------------+

Советник:

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void init()
 {
  int CheckingArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  Comment ("ArraySize (CheckingArray) = ", ArraySize (CheckingArray));
  ArrayResize (CheckingArray, 0);
 }
void deinit() {}
void start() {}
//+------------------------------------------------------------------+

Почему в советнике после первого вызова функции "init()" массив уничтожается на всегда? Ни какой другой вызов функции "init()" не возобновляет массив. Странно... По моему это так не должно быть. Это, ведь, функция! Сколько угодно вызывай - она должна работать одинакого.

В индикаторе работает, как положено.

 
Поидее, минимальный размер массива = 1
 
Zhunko >>:

В индикаторе работает, как положено.

Недавно тема поднималась. Фишка в особенностях загрузки советников в память.

 
ты когда сюда заходил надпись читал?
там написано - "единственный в мире язык торговых операций"
Значит, нужно
дождаться проявления улыбающихся небожителей и выслушать от них о необходимости именно такой логики инициации переменных.
А все остальное принтом)))
 

Получается, что массив объявленный в функции "init()" автоматически становиться объявленным на глобальном уровне? В смысле, как бы, на глобальном уровне.

Вот такой код работает:

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void init()
 {
  int CheckingArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  Comment ("ArraySize (CheckingArray) = ", ArraySize (CheckingArray), "\nCheckingArray[10] = {",
           CheckingArray[0], ", ", CheckingArray[1], ", ", CheckingArray[2], ", ", CheckingArray[3], ", ", CheckingArray[4], ", ",
           CheckingArray[5], ", ", CheckingArray[6], ", ", CheckingArray[7], ", ", CheckingArray[8], ", ", CheckingArray[9], "};");
  ArrayResize (CheckingArray, 0);
  ArrayResize (CheckingArray, 10);
 }
void deinit() {}
void start() {}
//+------------------------------------------------------------------+
Возможно, что от каждого вызова функции в памяти остаётся копия массива? Не проверял, но вполне возможно.
 
Zhunko >>:

Получается, что массив объявленный в функции "init()" автоматически становиться объявленным на глобальном уровне? В смысле, как бы, на глобальном уровне.

Вот такой код работает:

Возможно, что от каждого вызова функции в памяти остаётся копия массива? Не проверял, но вполне возможно.

Лучше так:

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void init()
 {
  int CheckingArray[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  Comment ("ArraySize (CheckingArray) = ", ArraySize (CheckingArray), "\nCheckingArray[10] = {",
           CheckingArray[0], ", ", CheckingArray[1], ", ", CheckingArray[2], ", ", CheckingArray[3], ", ", CheckingArray[4], ", ",
           CheckingArray[5], ", ", CheckingArray[6], ", ", CheckingArray[7], ", ", CheckingArray[8], ", ", CheckingArray[9], "};");

  CheckingArray[0] += 1;
 }
void deinit() {}
void start() {}
//+------------------------------------------------------------------+
 

А зачем? Не понял...

Мне надо надёжно уничтожить массив, а потом, чтобы при следующем вызове функции он был.

 
Zhunko >>:

А зачем? Не понял...

Мне надо надёжно уничтожить массив, а потом, чтобы при следующем вызове функции он был.

Чтобы убедиться в том, что никакого реаллокейта памяти не было. А вообще сначала размер в 0 потом в нужный, как, собственно, Вы и делаете.

Причина обращения: