27.02.2008, 16:12 | #1 |
Участник
|
Ограничения контейнера
Есть класс отчета.. надо запокавать >46 значений... А Аx4.0 кричит - ошибка компилятора в переполнение стека...
Ошибка здесь: Цитата:
[#macros] = packedValues;
как нибуть можно обойти? |
|
27.02.2008, 16:57 | #2 |
Moderator
|
попутно вспомнилось...
Из другой оперы (из другой ли?). Вот здесь: Передача переменнного числа параметров в метод тоже возникало переполнение стека в районе мистического диапазона "46-48". Может, из одного места ветер дует? Вопрос только - из какого?
|
|
27.02.2008, 17:17 | #3 |
Участник
|
Может быть... операция
X++: [] = container; фиг знает.. |
|
27.02.2008, 17:40 | #4 |
Moderator
|
Попробовал вложить контейнеры. В общем, конечно, получается больше
Обнаружил интересную особенность (следите за нумерацией первого элемента во вложенных контейнерах) X++: return [
[_par01, _par02, _par03, _par04, _par05, _par06],
[_par02, _par02, _par03, _par04, _par05, _par06],
[_par03, _par02, _par03, _par04, _par05, _par06],
....
[_par41, _par02, _par03, _par04, _par05, _par06],
[_par42, _par02, _par03, _par04, _par05, _par06],
[_par43, _par02, _par03, _par04, _par05, _par06]
]; Но если мы заменим последнюю строку на: X++: [_par43, _par02, _par03, _par04, _par05, _par06, _par07] Код: 1 2 3 ... 41 42 43 44 45 46 47 48 (а вот 49 уже нельзя) Отмечу, что у меня это в Axapta 3.0 SP4. Так что конкретно DAX 4 тут ни при чём. |
|
27.02.2008, 17:47 | #5 |
Участник
|
В том то всё и дело - в 3.0 работает.. мигрирую отчет (+ класс AssetSumCalc)
|
|
27.02.2008, 17:49 | #6 |
Участник
|
Это переполнение стека парсера. Если взять KOAN то можно посмотреть, что введение плюсиков уменьшает глубину синтаксического дерева
|
|
27.02.2008, 17:59 | #7 |
Moderator
|
Цитата:
Сообщение от belugin
Это переполнение стека парсера. Если взять KOAN то можно посмотреть, что введение плюсиков уменьшает глубину синтаксического дерева
|
|
27.02.2008, 18:00 | #8 |
Участник
|
Что за плюсики ? Думаешь += ??
Да сохранить он сохроняет... Я обратно немогу достать значения... Это же стандартный pack/unpack. Как я разделю контейнер на 2 части? Тогда мне макрос надо разделять на 2 части и контейнер, чтобы сделать: X++: #localmacro.standard_pack_macro x, y, z, a, b, c #endmacro #localmacro.macro_1 x, y, z #endmacro #localmacro.macro_2 a, b, c #endmacro [#macro_1] = con1; [#macro_2] = con2; Последний раз редактировалось Delfins; 27.02.2008 в 18:03. |
|
27.02.2008, 18:08 | #9 |
Участник
|
|
|
27.02.2008, 18:49 | #10 |
Administrator
|
Сталкивался с такой же ошибкой, только у меня был код следующего плана:
X++: container listFields; ; listFields = [ fieldnum(MyTable, field1), ....... fieldnum(MyTable, fieldN) ]; Проанализировав (точнее поэкспериментировав), решил, что компилятор "раскладывает" код как бы в "одну строку" от точки с запятой до точки с запятой исключая пробелы, переводы строк и комментарии. Эта "одна строка" должна быть не длиннее 1000 символов (максимальная длина строки в Axapta). Свое предположение я проверил, подсчитав количество символов в своем коде, без учета пробелов, переводов строки и комментариев. Магическое число 1000 (предел) убедило меня в этом. Однако, это были мои домыслы. Все-таки ситуация далеко нечастая , однако имеющая место быть для контейнеров. += действительно спасли меня в свое время (я просто разбил формирование контейнера). Распаковку же контейнера я делал "ручками", т.е. циклом, поэтому проблемы RunBase я не наблюдал. Мне кажется, что в данной ситуации похожий случай. Проверялось все на приложении Ax 3.0 SP3 CU1 с ядром KR3. На 4-ке не пробовал.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 27.02.2008 в 18:57. |
|
27.02.2008, 18:57 | #11 |
Участник
|
Вложенность там такая. В грамматике написано что
контейнер = [ <выражение> <хвост_контейнера> хвост_контейнера = ] или, <выражение> <хвост_контекнера> таким образом при разбре получается дерево контеййнер(выражение("1"), хвостконтейнера("," выражение("1") )) вобщем можно зафигачить в KOAN и посмотреть. |
|
|
За это сообщение автора поблагодарили: sukhanchik (3). |
27.02.2008, 19:00 | #12 |
Administrator
|
Спасибо за разъяснения. Но в моем случае (который я привел) - разбор тоже присутствует? У меня же еще нет сформированного контейнера. Ошибка возникает на этапе его формирования.
Ок, попытаюсь попробовать KOAN...
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 27.02.2008 в 19:03. |
|
27.02.2008, 19:04 | #13 |
Участник
|
Вроде работает...
X++: protected void unpackServer(container packedServer) { container conCopy(container _c, int _start, int _cnt) { int _i; container _ret; ; for (_i=_start;_i<=_start+_cnt;_i++) { _ret += conPeek(_c,_i); } return _ret; } ; [#Server2Client] = packedServer; [#Server2Client_X] = conCopy(packedServer,47,7); } protected container packServer() { return [#Server2Client] + [#Server2Client_X]; } |
|
27.02.2008, 19:12 | #14 |
Administrator
|
В общем-то логично что работает... Разбиение не приводит к переполнению...
2belugin: Попробовал KOAN: Вот что он мне написал:
__________________
Возможно сделать все. Вопрос времени |
|
Теги |
ax3.0, ax4.0 |
|
Похожие темы | ||||
Тема | Ответов | |||
while select зацикливается на одной записи | 7 | |||
Ограничения на таблицы и поля таблиц | 3 | |||
Открытие контейнера из Map | 12 | |||
Инвентаризация. Ограничения. | 5 | |||
Эксплуатация Olap в Axapta | 8 |
|