Вопрос о массивах

 
Правильно ли я понял, что массивы являются как бы глобальными переменными для данной функции, то есть не сохраняются в стеке вызовов?
При рекурсии массивы не изменяются...
Код
int start()
  {
//----
   int i = 0;
   recursive(i);
//----
   return(0);
  }
 
void recursive(int i)
{
   int a[1];
   a[0] += 1;
   Print(a[0]);
   if (i<4) recursive(i+1);
   Print(a[0]);
}
дает 1 2 3 4 5 5 5 5 5 5,
а должен 1 1 1 1 1 1 1 1 1 1 PS: так правильно.
В документации такая "фича" не описана.

Заранее благодарен за комментарий.
 
alexiso314:
Правильно ли я понял, что массивы являются как бы глобальными переменными для данной функции, то есть не сохраняются в стеке вызовов?
Да, я тоже замечал что массивы (даже локальные) не обнуляются при выходе из функции. Более того, измененный размер тоже сохраняется.
Поэтому всегда перед использованием делаю ресайз+инит.
 
Про сохранение размера массива есть упоминание в описании функции ArrayResize, а вот про постоянность содержимого массива для разных вызовов функции - ни слова. Походу память под массив выделяется один раз при запуске программы, а указатель на массив сохраняется в дескрипторе функции. Таким образом объявление массива не приводит к созданию переменной и выделению под неё памяти (как в С), а всего лишь восстанавливается старый указатель на старый массив.
Мне кажется, что это натуральный "баг", который убивает на корню идею рекурсии.
Придется ручками делать стэк, сохранять и восстанавливать указатели. ..
 
alexiso314:
Мне кажется, что это натуральный "баг", который убивает на корню идею рекурсии.
Придется ручками делать стэк, сохранять и восстанавливать указатели. ..

Не горячитесь. Просто попробуйте в рекурсивно вызываемой функции использовать массив. Вы увидите, что всё в порядке.
 
Спасибо большое за ответ, но я пришел к этой проблеме именно через неоднократные попытки использования массивов в рекурсии. К сожалению массивы, по крайней мере в моем 211 билде, работают именно таким образом, то есть не восстанавливаются при возврате из рекурсии. Выше приведенный пример наглядно это показывает. Пришлось реализовать рекурсию так:
int start()
  {
//----
   int i = 0;
   recursive(i);
//----
   return(0);
  }
 
void recursive(int i)
{
   int a[1];
   int ind[1]; // Смещение внутри массива для текущей итерации
   int len = 1; // Требуемая длина массива на текущей итерации
   ArrayResize(a,len+ind[0]); // Увеличение общей длины массива для его использования на текущей итерации рекурсии
   a[ind[0]+0] += 1; // Вместо 0 - произвольный индекс в пределах текущей длины массива
   Print(a[ind[0]+0]);
   ind[0] += len;  // Сдвиг указателя на текущую длину массива перед рекурсивным вызовом
   if (i<4) recursive(i+1);
   ind[0] -= len;  // Восстановление указателя после рекурсивного вызова
   Print(a[ind[0]+0]);
}
Результат: 1 1 1 1 1 1 1 1 1 1, как и требовалось.
Хотя, согласитесь, это несколько неестественно... Было бы замечательно, если бы в MQL5 (если он, конечно, будет) массивы были бы реализованы конвенционным способом. Заранее спасибо.
Причина обращения: