|
28.07.2008, 11:59 | #1 |
Гость
|
Рекурсия, память
Axapta 3.0 SP4
Хотелось посмотреть, как Аксапта будет реагировать на рекурсию: Код: int rn(int i) { int loop(int _i) { int j = _i+1; ; j = j>10?1:j; return j; } do { loop(i); } while (true); return i; } Реальной задачи на самом-то деле - нет, но есть интерес |
|
28.07.2008, 12:20 | #2 |
Программатор
|
KernelRollup (или как то так) какой?
|
|
28.07.2008, 12:54 | #3 |
Гость
|
cудя по инфо с этой странички:
http://forum.mazzy.ru/index.php?showtopic=881 Axapta 3.0 EE SP4 FP1 1951.4060 514-320 SP4 OP023-196 я так понимаю, что никаких 'kernel rollup' не накачено? То есть ядро не патчилось? |
|
28.07.2008, 12:24 | #4 |
Участник
|
А где, собственно, рекурсия?
Я вижу только странный бесконечный цикл |
|
28.07.2008, 12:35 | #5 |
Гость
|
с рекурсией будет ещё хуже - она у меня падает на 400-м шаге.
Последнее значение j до переполнения = 399 Ошибка времени выполнения. : Переполнение во внутреннем стеке исполнения кода. Код: int rn(int i) { int loop(int _i) { int j = _i+1; ; j = j>600?1:j; print j; if (j<500) loop(j); return j; } do { loop(i); } while (true); return i; } |
|
28.07.2008, 13:21 | #6 |
Moderator
|
400 - это, вроде, стандартное ограничение на глубину вызовов методов и вложенных функций (прочитал в книге Еременко, Шашкова на стр.242)
|
|
28.07.2008, 12:50 | #7 |
Участник
|
Только что проверил на АХ 2009. С первым заданием все ОК - утечек нет.
Второе вызывает переполнение внутреннего стека. Но, рекурсия глубиной 500 - маловероятно. Даже 399 - довольно много |
|
28.07.2008, 12:56 | #8 |
Гость
|
Цитата:
Код: int rn(int i) { int loop(int _i) { int j = _i+1; ; j = j>600?1:j; print j; if (j<300) loop(j); return j; } do { loop(i); } while (true); return i; } |
|
28.07.2008, 13:10 | #9 |
Участник
|
У меня и такой вариант нормально.
Скорее всего, дело действительно в необходимости накатить какие-то патчи на kernell |
|
28.07.2008, 13:38 | #10 |
Программатор
|
KR 2 поставить надо ИМХО. Там с утечкой памяти пофиксино чегото было.
|
|
|
За это сообщение автора поблагодарили: (1). |
28.07.2008, 15:28 | #11 |
Гость
|
спасибо за совет. окончательно расстроился на этом...
Код: do { } while (true) |
|