Опять проблемы с компилятором. - страница 3

 
Zhunko >>:

Так, почему эта проблема только с советеиками?

С индикаторами, даже более длинными, чем советник, такого не происходит.

Приложите к комментарию полный код некомпилируемого эксперта или вышлите его Славе по адресу stringo AT metaquotes ru (он удалит файл после тестов).

 
Renat >>:

Приложите к комментарию полный код некомпилируемого эксперта или вышлите его Славе по адресу stringo AT metaquotes ru (он удалит файл после тестов).

Эксперт компилируется, только появляется активным в "Навигаторе" не с первой компиляции.

 

Вот такая ошибка при компиляции:

'stSum_Alert' - internal stack overflow-simplify the program, please E:\Market\Forex\MetaTrader - Alpari 4.00\experts\ZN_AIASM EXPERT 0-81028.mq4 (280, 69)

Возникает при превышении какой-то длины кода.

Сколько строк теперь не знаю, не считал, но точно, что более 30000.

 

Посчитал.

Компилируемый код без библиотек 8355 строк.

Закомметированы пока ещё около 10000 строк. Их когда-нибудь придёться открыть... :-(

Библиотеки не считал, потому, как их длина не влияет на появлении этой ошибки.

=============

Метаквоты, может можно убрать это ограничение?

 

Не хватило рабочего (внутреннего) стека для того, чтобы до конца раскрутить выражение, заключённое в фигурные скобки. Упрощение заключается в уменьшении количества вложений. Примерно так:

{
   A;
   {
      B;
      {
         C;
         {
            D;
         }
      }
   }
}

можно преобразовать в

{
   A;
   {
      B;
      {
         C;
         call D;
      }
   }
}
//---
{
   D;
}
 
Zhunko писал(а) >>

Посчитал.

Компилируемый код без библиотек 8355 строк.

Закомметированы пока ещё около 10000 строк. Их когда-нибудь придёться открыть... :-(

Библиотеки не считал, потому, как их длина не влияет на появлении этой ошибки.

=============

Метаквоты, может можно убрать это ограничение?

Дело не в количестве строк кода вообще, а в количестве вложенных друг в друга блоков.

Если мы увеличим (и так немаленький) размер внутреннего стека, то с Вашим стилем программирования Вы быстро преодолеете и новое ограничение. Динамический же стек мы делать категорически не будем.

 
stringo >>:

Дело не в количестве строк кода вообще, а в количестве вложенных друг в друга блоков.

Если мы увеличим (и так немаленький) размер внутреннего стека, то с Вашим стилем программирования Вы быстро преодолеете и новое ограничение. Динамический же стек мы делать категорически не будем.

Да, заметил это. Не написал.

Действительно, если закоментировать блоки в init(), то ошибка не исчезает, если в start(), то пропадает.

=========

То, что Вы предлагаете, можно решить, в большинстве случаев, через создание функций вместо "лишних" блоков.

Это ведёт к уменьшению скорости выполнения программы. Стиль такой - зачем создавать функцию, если эта функция вызывается только в одном месте?

У меня много вложенных друг в друга циклов. Заменить их можно только на функции. Вызов функции в цикле... Это тормоз.

А динамический стек это прекрасно! По крайней мере звучит красиво :-)

 
Zhunko >>:

Опять проблема :-(

Может не такая ужасная...

Почему-то не компилируются с первого раза советники. Вернее компилируются, но они становятся не активными в навигаторе. Только повторное компилирование делает их активными в навигаторе. Раньше в прежних билдах такого не наблюдалось.

Правда, иногда получается и с первого компилирования.

По этой проблеме есть наблюдение.

Если в процессе компиляции в МЭ4 на вкладке "Ошибки" появляется сообщение об отсутствии ошибок до прекращения процесса "MetaLang", то эксперт в навигаторе неактивен.

Если после или в конце процесса "MetaLang", то эксперт в навигаторе становиться активен.

 

Провёл эксперимент.

В диспетчере задач выделил процесс "MetaLang". В процессе компилирования процесс исчез, а потом появился уже не выделенный.

Получается, что компилятор запускался два раза. Именно в такие моменты эксперт становиться неактивным в навигаторе.

 
Метаквоты, сделайте подарок. Снизойдите! Что-нибудь скажите по последним постам.
Причина обращения: