Slam_Sergo
2.07.2006 - 11:35
Собственно пост!!!
MustLive
2.07.2006 - 15:57
Slam_Sergo
Во флеше имеется такое ограничение - глубина рекурсии в 256 итераций. Сам с такой проблемой не сталкивался (практически не использовал во флеше рекурсии и не доводилось доходить до ограничения её глубины), но о проблеме доводилось слышать.
Могу порекомендовать следующие пути:
1) Используй несколько функций (аналогичных, но с разными именами). И проверяй (счётчик) на приближение к лимиту. Если в первой функции счётчик приблизился к 256, вызывай рекурсивно не эту функцию, а уже вторую, а из неё всё начинается сначала (она сама себя вызывает рекурсивно), пока её счётчик не дойдёт до лимита, а там вызывается первая.
Это поможет, если после вызова другой рекурсивной функции, флеш сбросит "свой" счётчик рекурсий, и тогда можно будет вызывать по 256 раз то одну, то другую функцию - и так сколько нужно раз. Если же флеш запоминает и никак не захочет сбрасывать счётчик рекурсий (после таких пропусков), то смотри п.2.
2) Сделать столько функций сколько нужно (по задумке) для рекурсий, каждая функция рассчитана на 256 вызовов. Как только лимит достигнут вызывается следующая. И так по цепочке. Функционал у функций идентичный, лишь имена различны и вызывается следующая функция по цепочке.
Slam_Sergo
3.07.2006 - 18:12
Это отлично конечно. Но насколько я понимаю, флэш считает не только вхождения в рекурсию, но и вхождения в функции вызванные из других функций. И всё-таки смысл в этом есть, спасибо за ответ, попробую поковыряюсь.
MustLive
3.07.2006 - 20:08
Пожалуйста.
Попробуй, всё должно получится.
Как бы флеш не считал вызовы из других функций, я же описал во втором варианте решение, которое подразумевает столько функций, сколько нужно получить рукурсивных вызовов делённое на 256. Т.е. из одной рекурсивной функции в конце вызывается другая, которая уже сама работает рукурсивно и не обращается более к первой (а в конце вызывает третью функцию и т.д.).
Боюсь, ничего из этого не получится. Это все по той простой причине что существует такой себе arguments.caller - ссылка на объект, вызвавший текущий. После вызова некой другой функции из данной та, другая, все равно поставится в ту же рекурсивную цепочку, так как она точно будет знать, кто ее вызвал. Попытки убить caller (присвоить значение null, к примеру) ни к чему не приводят - похоже, он обрабатывается еще до входа в тело функции =(
P.S. Vista rules =))
chingachgoog
16.03.2011 - 20:01
Можно отредактировать тэг scriptLimits в swf-файле.
MustLive
20.03.2011 - 02:15
Цитата
Можно отредактировать тэг scriptLimits в swf-файле.
Верно подметил, chingachgoog - можно отредактировать свойство MaxRecursionDepth в тэге scriptLimits swf-файла для задания нужной глубины рекурсии.
P.S.
Отредактировать данный тэг можно лишь если он есть

. А если его нет в swf-файле, то его можно добавить.
chinaboyz
7.04.2011 - 20:09
Сложновато как для моего понимания...
-------------
chingachgoog
8.04.2011 - 13:10
Надо установить flasm (для AVM1). Там этог тэг виден.
Для лучшего понимания надо скачать из сети главу 20 из книги Гурского ActionScript 2.0. Для профессионалов. Эта глава распространяется бесплатно в виде архива с doc-файлом.
MustLive
9.04.2011 - 00:29
Для AVM1 можно использовать flasm, а для AVM2 - yogda. И через эти дизассемблеры можно работать с тэгом scriptLimits.