Связь между оператором FOR-TO и максимальным количеством параметров функции
Сегодня мне пришлось столкнуться с одним, так и хочется сказать, побочным эффектом работы C/SIDE. После некоторого времени, затраченного на поиски проблемы, пришло понимание, которым я и хочу с вами поделиться.
Как это началось
Представьте, что у вас есть два куска кода:
Пример 1:
Param10,Param11,Param12,Param13,Param14,Param14,Param15,Param16,Param17);
Пример 2:
MyFunction(Param1,Param2,Param3,Param4,Param5,Param6,Param7,Param8,Param9,
Param10,Param11,Param12,Param13,Param14,Param15,Param16,Param17);
end;
Вопрос – в чем разница между этими двумя частями кода?
….
Ответ: второй кусок кода не компилируется? Вы в шоке? То-то, я тоже был в шоке :)
Вот какое сообщение об ошибке вы получите при компиляции:
Microsoft Dynamics NAV
---------------------------
Reduce the expression so it IS less complex.
---------------------------
OK
---------------------------
Но почему? В первом примере выражение то же самое, однако оно ни сколечки не «too complex» (слишком сложное?) Так в чем проблема?
Сначала я проделал то же самое – вызов той же функции – в других блочных операторах:
IF-THEN-ELSE и REPEAT-UNTIL. Все в порядке, все работает.
Проблема заключается именно в работе цикла FOR-TO. Я провел небольшую научно-исследовательскую работу, выводы следующие: каждый цикл FOR-TO уменьшает количество доступных параметров функции, вызываемой в теле цикла, на 3, при условии, что циклы вложенные. Количество параметров при этом не зависит от типа данных в самих параметрах и их размера. То есть, у вас одинаковое доступное количество параметров, неважно, что это – Text1000 или Text1.
Выводы
- В C/Side стек хранения локальных переменных ограничен двадцатью.
- Каждый цикл FOR-TO занимает три переменных в стеке (наверное, это «Начальное значение», «Конечное значение», «Текущее значение»?)
- Максимум вложенных циклов в C/AL – шесть (20 dev 3 = 6), после этого программа будет вылетать с вышеуказанной ошибкой.
- Если вам нужно больше вложенных циклов, и больше переменных – используйте другие варианты цикла – операторы WHILE или REPEAT-UNTIL.
- При работе с шестью вложенными циклами, вы можете вызывать функции только с одним параметром (внутри самого внутреннего цикла).
Заключение
При получении подобной ошибки – проверьте количество параметров фукнций и количество уровней вложенности в циклах FOR-TO. Если нужно использовать 20 параметров, замените вызов FOR на WHILE-DO или REPEAT-UNTIL.
Похоже, ограничение основано на волшебном числе «20», которое используется в синтаксическом анализаторе при создании стека.
20 – это волшебное число навижна по всей системе. У вас есть только 20 поле для работы SumIndexedFields, 20 полей в первичным ключе и так далее….
Проверено на NAV 5.00SP1, Update 2.
Вольный перевод заметки «http://dynamicsuser.net/blogs/kine/archive/2010/04/02/relation-between-for-to-and-max-count-of-function-parameters.aspx»

Автор: Андрей Стрельников
В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.
Количество статей, опубликованных автором: 86.