alexiso314:
Правильно ли я понял, что массивы являются как бы глобальными переменными для данной функции, то есть не сохраняются в стеке вызовов?
Да, я тоже замечал что массивы (даже локальные) не обнуляются
при выходе из функции. Более того, измененный размер тоже сохраняется.
Правильно ли я понял, что массивы являются как бы глобальными переменными для данной функции, то есть не сохраняются в стеке вызовов?
Поэтому всегда перед использованием делаю ресайз+инит.
Про сохранение размера массива есть упоминание в описании функции
ArrayResize, а вот про постоянность содержимого массива для разных вызовов
функции - ни слова. Походу память под массив выделяется один
раз при запуске программы, а указатель на массив сохраняется
в дескрипторе функции. Таким образом объявление массива не
приводит к созданию переменной и выделению под неё памяти (как
в С), а всего лишь восстанавливается старый указатель на старый
массив.
Мне кажется, что это натуральный "баг", который убивает на корню идею рекурсии.
Придется ручками делать стэк, сохранять и восстанавливать указатели. ..
Мне кажется, что это натуральный "баг", который убивает на корню идею рекурсии.
Придется ручками делать стэк, сохранять и восстанавливать указатели. ..
alexiso314:
Мне кажется, что это натуральный "баг", который убивает на корню идею рекурсии.
Придется ручками делать стэк, сохранять и восстанавливать указатели. ..
Мне кажется, что это натуральный "баг", который убивает на корню идею рекурсии.
Придется ручками делать стэк, сохранять и восстанавливать указатели. ..
Не горячитесь. Просто попробуйте в рекурсивно вызываемой функции использовать массив. Вы увидите, что всё в порядке.
Спасибо большое за ответ, но я пришел к этой проблеме именно
через неоднократные попытки использования массивов в рекурсии.
К сожалению массивы, по крайней мере в моем 211 билде, работают
именно таким образом, то есть не восстанавливаются при возврате
из рекурсии. Выше приведенный пример наглядно это показывает.
Пришлось реализовать рекурсию так:
Хотя, согласитесь, это несколько неестественно... Было бы замечательно, если бы в MQL5 (если он, конечно, будет) массивы были бы реализованы конвенционным способом. Заранее спасибо.
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 (если он, конечно, будет) массивы были бы реализованы конвенционным способом. Заранее спасибо.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
При рекурсии массивы не изменяются...
Код
дает 1 2 3 4 5 5 5 5 5 5,
а должен 1 1 1 1 1 1 1 1 1 1 PS: так правильно.
В документации такая "фича" не описана.
Заранее благодарен за комментарий.