Связь между оператором FOR-TO и максимальным количеством параметров функции

Сегодня мне пришлось столкнуться с одним, так и хочется сказать, побочным эффектом работы C/SIDE. После некоторого времени, затраченного на поиски проблемы, пришло понимание, которым я и хочу с вами поделиться.

Как это началось

Представьте, что у вас есть два куска кода:

Пример 1:

MyFunction(Param1,Param2,Param3,Param4,Param5,Param6,Param7,Param8,Param9,
Param10,Param11,Param12,Param13,Param14,Param14,Param15,Param16,Param17);

Пример 2:

for j :=1 to 1 do begin
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.

Выводы

  1. В C/Side стек хранения локальных переменных ограничен двадцатью.
  2. Каждый цикл FOR-TO занимает три переменных в стеке (наверное, это «Начальное значение», «Конечное значение», «Текущее значение»?)
  3. Максимум вложенных циклов в C/AL – шесть (20 dev 3 = 6), после этого программа будет вылетать с вышеуказанной ошибкой.
  4. Если вам нужно больше вложенных циклов, и больше переменных – используйте другие варианты цикла – операторы WHILE или REPEAT-UNTIL.
  5. При работе с шестью вложенными циклами, вы можете вызывать функции только с одним параметром (внутри самого внутреннего цикла).

Заключение

При получении подобной ошибки – проверьте количество параметров фукнций и количество уровней вложенности в циклах 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.

Добавить комментарий