AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.02.2008, 16:12   #1  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Ограничения контейнера
Есть класс отчета.. надо запокавать >46 значений... А Аx4.0 кричит - ошибка компилятора в переполнение стека...

Ошибка здесь:
Цитата:
[#macros] = packedValues;
Это баг?
как нибуть можно обойти?
Старый 27.02.2008, 16:57   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
попутно вспомнилось...
Из другой оперы (из другой ли?). Вот здесь: Передача переменнного числа параметров в метод тоже возникало переполнение стека в районе мистического диапазона "46-48". Может, из одного места ветер дует? Вопрос только - из какого?
Старый 27.02.2008, 17:17   #3  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Может быть... операция
X++:
[] = container;
вызывает какую нибуть internal-функцию, в которой тот же лимит :[
фиг знает..
Старый 27.02.2008, 17:40   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Попробовал вложить контейнеры. В общем, конечно, получается больше
Обнаружил интересную особенность (следите за нумерацией первого элемента во вложенных контейнерах)
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]
];
Т.е. вложенных элементов вроде как 43 и до 48 есть еще 5.
Но если мы заменим последнюю строку на:
X++:
[_par43, _par02, _par03, _par04, _par05, _par06, _par07]
то опять получим переполнение стека. Получается, что хитрая нумерация идёт по "сторонам прямоугольника" как-то так:
Код:
1
2
3
...
41
42
43 44 45 46 47 48 (а вот 49 уже нельзя)
Т.е. кол-во "строк" + кол-во "столбцов" последней "строки" - 1 не должно превышать 48. Это для 2-мерного случая. В 3-мерный не полезу!

Отмечу, что у меня это в Axapta 3.0 SP4. Так что конкретно DAX 4 тут ни при чём.
Старый 27.02.2008, 17:47   #5  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
В том то всё и дело - в 3.0 работает.. мигрирую отчет (+ класс AssetSumCalc)
Старый 27.02.2008, 17:49   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Это переполнение стека парсера. Если взять KOAN то можно посмотреть, что введение плюсиков уменьшает глубину синтаксического дерева
Старый 27.02.2008, 17:59   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от belugin Посмотреть сообщение
Это переполнение стека парсера. Если взять KOAN то можно посмотреть, что введение плюсиков уменьшает глубину синтаксического дерева
Ну, вот и разобрались. Так что, Delfins, пишите: контейнер += элемент; и не мучайтесь сомнениями
Старый 27.02.2008, 18:00   #8  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Что за плюсики ? Думаешь += ??
Да сохранить он сохроняет... Я обратно немогу достать значения... Это же стандартный 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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Delfins Посмотреть сообщение
Что за плюсики ? Думаешь += ??
Да сохранить он сохроняет... Я обратно немогу достать значения...
конпиками придется...
Старый 27.02.2008, 18:49   #10  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,330 / 3557 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Сталкивался с такой же ошибкой, только у меня был код следующего плана:
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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Вложенность там такая. В грамматике написано что

контейнер = [ <выражение> <хвост_контейнера>
хвост_контейнера = ] или, <выражение> <хвост_контекнера>

таким образом при разбре получается дерево

контеййнер(выражение("1"), хвостконтейнера("," выражение("1") ))

вобщем можно зафигачить в KOAN и посмотреть.
За это сообщение автора поблагодарили: sukhanchik (3).
Старый 27.02.2008, 19:00   #12  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,330 / 3557 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Спасибо за разъяснения. Но в моем случае (который я привел) - разбор тоже присутствует? У меня же еще нет сформированного контейнера. Ошибка возникает на этапе его формирования.
Ок, попытаюсь попробовать KOAN...
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 27.02.2008 в 19:03.
Старый 27.02.2008, 19:04   #13  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Вроде работает...
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  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,330 / 3557 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
В общем-то логично что работает... Разбиение не приводит к переполнению...
2belugin: Попробовал KOAN:
Вот что он мне написал:
Изображения
 
__________________
Возможно сделать все. Вопрос времени
Теги
ax3.0, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
while select зацикливается на одной записи ViV DAX: Программирование 7 05.02.2019 12:54
Ограничения на таблицы и поля таблиц akvi DAX: Администрирование 3 28.04.2007 15:03
Открытие контейнера из Map tolstjak DAX: Программирование 12 12.11.2006 18:01
Инвентаризация. Ограничения. bucken DAX: Функционал 5 12.07.2004 15:28
Эксплуатация Olap в Axapta Ingvarr DAX: Функционал 8 23.06.2003 08:01

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:59.